Bonjour,

Je cherche à récupérer la liste des formats (containers) vidéos en lecture de FFMPEG (FFMPEG 0.9.1) pour les proposer dans la liste des filtres d'une boîte de dialogue lors de l'ouverture de médias. Je ne veux que la liste des containers qui supportent la vidéo (et donc par le format mp3 par exemple).

pour connaître les formats vidéos en écriture (encoding) de FFMPEG, j'utilise AVOutputFormat::video_codec.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
for(AVOutputFormat * avOutputFormat = av_oformat_next(NULL); avOutputFormat != NULL; avOutputFormat = av_oformat_next(avOutputFormat)) 
{
	if(avOutputFormat->video_codec == CODEC_ID_NONE) 
	{
		continue;
	}
 
	....
 
}
Mais pour récupérer uniquement les formats vidéos en lecture (decoding) par FFMPEG, je ne trouve pas de solution avec la structure AVInputFormat. J'ai essayé comme ça :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
for(AVInputFormat * avInputFormat = av_iformat_next(NULL); avInputFormat != NULL; avInputFormat = av_iformat_next(avInputFormat)) 
{
	for(unsigned int index = 0; avInputFormat->codec_tag[index] != NULL; ++index)
	{
		AVCodec * codec = avcodec_find_decoder(avInputFormat->codec_tag[index]->id);
		if(codec == NULL)
		{
			codec = avcodec_find_decoder_by_name(avInputFormat->name);
			if((codec == NULL) || (codec->type != AVMEDIA_TYPE_VIDEO))
			{
				continue;
			}
		}
		else if(codec->type != AVMEDIA_TYPE_VIDEO))
		{
			continue;
		}
	}
 
	...
}
Mais ça ne fonctionne pas bien d'autant plus que j'utilise avcodec_find_decoder_by_name avec un nom de format. Par exemple, les formats suivants ne sont pas retenus :
  • le format ASF car codec_tag est NULL et avcodec_find_decoder_by_name retourne NULL (ce qui est normal puisque ASF n'est pas un codec)
  • le format AVI pour les mêmes raisons
  • le format DVVidéo pour les mêmes raisons
  • le format Matroska pareil
  • etc


Du coup, j'ai essayé de voir l'aide de ffmpeg.exe (--help) pour voir si je pouvais pomper des trucs dans le source. Mais pour la commande

on a seulement l'information encoding / decoding mais pas d'information sur le support vidéo ou audio du container. Donc je me demande si c'est possible. Si ça ne l'est pas c'est quand même curieux !

Quand on exécute la commande

on a cette information audio / video mais je n'arrive pas à relier les deux. C'est à dire récupérer uniquement les formats qui supportent des codecs vidéos seulement (pour éventuelle solution alternative).

Est-ce que quelqu'un s'est déjà confronté à ce problème ? Et comment le résoudre ?

Merci

Flo.