2013-06-11 7 views
0

Я написал код C, который принимает файл mp4 с кодированным h264 видео и аудио в формате AAC и записывает его в сегментированные файлы .ts.Преобразование mp4 в mpeg2-ts сбоев на аудиопакетах

Код можно посмотреть здесь: http://pastebin.com/JVdgjM9G

Проблема заключается в том, что код дроссели на аудиопакетов. Поскольку я конвертирую из h264, я должен использовать «h264_mp4toannexb», который, наконец, я получил для видеокадров. Однако, как только программа достигает первого аудиопакета (поток 1 ниже), он сработает.

Пример вывода:

Output #0, mpegts, to 'testvideo': 
    Stream #0.0: Video: libx264, yuv420p, 1280x720, q=2-31, 1416 kb/s, 90k tbn, 23.98 tbc 
    Stream #0.1: Audio: libfaac, 48000 Hz, stereo, 127 kb/s 
First chunk: testvideo-00001.ts 
Read frame, keyframe: 1, index: 0 
Did bitfilter fun! 
Read frame, keyframe: 0, index: 0 
Did bitfilter fun! 
(...this repeats several more times, truncated for space...) 
Did bitfilter fun! 
Read frame, keyframe: 0, index: 0 
Did bitfilter fun! 
Read frame, keyframe: 1, index: 1 
base(54516) malloc: *** error for object 0x7fd2db404520: pointer being freed was not allocated 
*** set a breakpoint in malloc_error_break to debug 
Abort trap: 6 

Я попытался изменить код также запустить фильтр на аудиопотока (с использованием audio_stream->codec вместо video_stream->codec), но это просто как раз выдает ошибку из фильтра.

Проблема возникает, когда я пытаюсь позвонить av_interleaved_write_frame(output_context, &packet); - для отфильтрованных видеопакетов нет проблем, но аудио пакет полностью задыхается. Я, как бы торопится, почему, хотя, поэтому любая помощь приветствуется.

+0

Таким образом, ошибка происходит по строке 297? Что такое объект 0x7fd2db404520? – idoby

+0

Это пакетный объект, насколько я могу судить. Я попробовал отладить его, но попал во что-то, где не было символов (черная дыра), и он не мог следовать за ним. Но пакет - это единственное, что меняется между каждой итерацией для этой функции, поэтому я не могу представить, что это что-то еще. –

+0

Это довольно много кода для отладки глазного яблока. Можете ли вы опубликовать это как строительный проект, включая любые библиотеки, чтобы люди могли вставлять его в виртуальную машину, строить и отлаживать ее? – idoby

ответ

0

Оказалось, что вызов av_free_packet после того, как обработка битфильтра фактически освободила видеопакеты. Удаление этого вызова заставило код работать правильно!