Может, это кому-то поможет сохранить пару часов отладки. Когда читаем видеопоток из файла, делаем что-то наподобие следующего:
AVPacket *m_pPacket = (AVPacket *)malloc(sizeof(AVPacket))
while(1)
{
int ret = av_read_frame(formatCtx, m_pPacket);
if (ret < 0)
// error
if (m_pPacket.stream_index == videoStreamIndex)
{
.... avcodec_decode_video ...
}
}
av_free_packet(m_pPacket);
free(m_pPacket);
Так вот, это неправильно, нужно вызывать av_free_packet после каждого av_read_packet:
AVPacket *m_pPacket = (AVPacket *)malloc(sizeof(AVPacket))
while(1)
{
int ret = av_read_frame(formatCtx, m_pPacket);
if (ret < 0)
// error
if (m_pPacket.stream_index == videoStreamIndex)
{
.... avcodec_decode_video ...
}
av_free_packet(m_pPacket);
}
free(m_pPacket);
P.S. Может, из текста не совсем понятно, это не бага в самом ffmpeg, это моя программа, используя libavcodec, libavformat (библиотеки ffmpeg), как я написал в начале поста, «текла».
А вы в рассылу ffmpeg написали?
Нет, не писал, это не бага у них.
Вообще у ffmpeg фактически нет документации. Лучшее, что я нашел – это http://www.dranger.com/ffmpeg/tutorial01.html, где как раз и приводится «ошибочный» код.
Это скорее бага в том tutorial.
Кстати, а кому-то интересен модуль на python, который использует библиотеки ffmpeg, чтобы собирать информацию о видео и вырезать из него кадры? Если это интересно, я могу подготовить его для open-source.
Меня бы заинтересовало, но я на Питоне не разрабатываю. А за пост – спасибо.
Здравствуйте Андрей. С удовольствием бы посмотрел такой модуль.
Андрей, тоже заинтересован. Хотя лучше конечно же на Си. Очень интересно посмотреть такие исходники с использованием библиотек ffmpeg.
Извините меня за откровенность – но помоему это и ежу понятно что – если data в AVPacket не равна 0 и меняется с каждым пакетом – то значит её кто-то выделяет – и очевидно предположить, что её выделяет ffmpeg а соответственно – её надо удалять