LINUX.ORG.RU

Вопрос по libavcodec.


0

1

Проблема: дикие значения переменной AVFormatContext::nb_streams (оч. большое число).
Код: (для краткости выкинута обработка ошибок).

void printA(AVFormatContext* _a)
{
	std::cout << "duration    " << (unsigned long)_a->duration << "\n";
	std::cout << "streams     " << _a->nb_streams << "\n";
	std::cout << "format name " << _a->iformat->name << "\n";
	std::cout << "bit_rate    " << _a->bit_rate << "\n";
	std::cout << "long name   " << _a->iformat->long_name << "\n";
}

int main(int argc, char **argv)
{
    const char *filename;

	if ( argc < 2 )
	{
		std::cout << "Usage: " << argv[0] << " <file>\n";
		return 1;
	}
	
        av_register_all();
	
	AVFormatContext *pFormatCtx = avformat_alloc_context();

	avformat_open_input (&pFormatCtx, argv[1], NULL, NULL);
	avformat_find_stream_info(pFormatCtx, NULL);
	
	printA( pFormatCtx );
	return 0;
}

xx@xx /tmp/avlib $ ./avlibtest /ar/video/Nauka.Sna.2006.HDRip.AVC.mkv 
[matroska,webm @ 0x804c040] max_analyze_duration reached
[matroska,webm @ 0x804c040] Estimating duration from bitrate, this may be inaccurate
duration    134741408
streams     134531840
format name matroska,webm
bit_rate    0
long name   Matroska/WebM file format

«streams 134531840» - вот проблема.

Это ты, полуёбок, три дня спрашивал во всех темах как ffmpeg может работать без libav (на случай, если память меня подводит)?

anonymous ()
Note:
    this function isn't guaranteed to open all the codecs, so options being non-empty at return is a perfectly normal behavior.
mv ★★★★★ ()
Ответ на: комментарий от mv

А я кодеки открывать и не прошу, мне бы количество потоков в контейнере узнать и всё. Не может их там быть стопицот. Вставленный printf() в исходник avplay (ffplay) печатает на этом месте «5».

kiverattes ★☆ ()

avformat_open_input (&pFormatCtx

заменить на avformat_open_input (pFormatCtx

думаю, должно помочь.

waker ★★★★★ ()
Ответ на: комментарий от waker

Он хочет указатель на указатель. Так везде - в коде ffmpeg, например.

kiverattes ★☆ ()
Ответ на: комментарий от kiverattes

да, ты прав. забыл про это. а не забыл ли ты какой-нибудь avformat_init? у меня в коде avformat практически не используется, поэтому не могу понять сходу чего не хватает.. но почему бы тупо не выдрать код из ffplay? и еще посмотри что возвращают avformat_open_input и avformat_find_stream_info.

waker ★★★★★ ()
Ответ на: комментарий от waker

Что они возвращают я смотрю - как сказано в первом посте, обработка ошибок опущена. Возвращаются там нули. Из ffplay просто так не выдерешь, много обвязки. Я смотрю вот на такой код:

http://cekirdek.pardus.org.tr/~ismail/ffmpeg-docs/ffplay_8c-source.html (строка 2412).

кстати, ffplay практически то же самое, что avplay - по крайней мере та же конструкция с функцией «decode_thread».

У меня повторена инициализация из этого туториала: http://www.inb.uni-luebeck.de/~boehme/using_libavcodec.html То есть av_register_all() и всё.

kiverattes ★☆ ()
Ответ на: комментарий от kiverattes

в примере av_open_input_file, av_find_stream_info(pFormatCtx)

а у тебя avformat_open_input, avformat_find_stream_info

разный код может требовать разной инициализации.

waker ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.