#ffmpeg #libav
#ffmpeg #libav
Вопрос:
Я конвертирую файлы .mov в файлы .mpg с помощью avconv. Команда, выполняемая моим php-приложением, выглядит следующим образом:
avconv -y -i ‘$ finalvideo’ -целевой ntsc-dvd -аспект 4: 3 ‘$ mpgvideo’> $logs
Я могу конвертировать небольшие файлы .mov в .mpg без каких-либо проблем. Однако я не могу конвертировать видео длиной более десяти или пятнадцати минут. Файл журнала полностью пуст. Когда я запускаю команду напрямую, кадр останавливается где-то около 34000, независимо от того, какое видео я выбираю.
Процессор показывает 97% использования в этом процессе, однако ничего не происходит.
ОС Ubuntu 10 ~
Как я могу собрать больше информации об этом остановленном процессе?
Вот замороженный вывод
avconv version 0.7, Copyright (c) 2000-2011 the Libav developers
built on Nov 3 2011 13:39:09 with gcc 4.3.3
Seems stream 0 codec frame rate differs from container frame rate: 180000.00 (180000/1) -> 23.98 (24000/1001)
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/var/www/sites/default/files/compiled_videos/573-stream.mov':
Metadata:
major_brand : qt
minor_version : 512
compatible_brands: qt
creation_time : 1970-01-01 00:00:00
encoder : Lavf53.0.3
Duration: 00:18:53.49, start: 0.000000, bitrate: 1430 kb/s
Stream #0.0(eng): Video: h264 (Main), yuv420p, 854x480, 1387 kb/s, 25.60 fps, 23.98 tbr, 90k tbn, 180k tbc
Metadata:
creation_time : 1970-01-01 00:00:00
Stream #0.1(eng): Audio: aac, 48000 Hz, stereo, s16, 126 kb/s
Metadata:
creation_time : 1970-01-01 00:00:00
[buffer @ 0x9d88820] w:854 h:480 pixfmt:yuv420p
[scale @ 0x9d88b60] w:854 h:480 fmt:yuv420p -> w:720 h:480 fmt:yuv420p flags:0x4
Incompatible sample format 's16' for codec 'ac3', auto-selecting format 'flt'
Output #0, dvd, to '/var/www/sites/default/files/compiled_videos/573.mpg':
Metadata:
major_brand : qt
minor_version : 512
compatible_brands: qt
creation_time : 1970-01-01 00:00:00
encoder : Lavf53.10.0
Stream #0.0(eng): Video: mpeg2video, yuv420p, 720x480 [PAR 8:9 DAR 4:3], q=2-31, 6000 kb/s, 90k tbn, 29.97 tbc
Metadata:
creation_time : 1970-01-01 00:00:00
Stream #0.1(eng): Audio: ac3, 48000 Hz, stereo, flt, 448 kb/s
Metadata:
creation_time : 1970-01-01 00:00:00
Stream mapping:
Stream #0.0 -> #0.0 (h264 -> mpeg2video)
Stream #0.1 -> #0.1 (aac -> ac3)
Press ctrl-c to stop encoding
[mpeg2video @ 0x9d8bf20] rc buffer underflow
Input stream #0.1 frame changed from rate:48000 fmt:s16 ch:2 to rate:48000 fmt:flt ch:2
frame=33910 fps= 91 q=2.0 size= 151922kB time=336.58 bitrate=3697.7kbits/s dup=5475 drop=530
О, интересно. Я использовал -loglevel debug -debug . Я видел эту информацию
stream #0:
keyframe=0
duration=0.000
dts=1133.449 pts=1133.533
size=103
*** 1 dup!
stream #0:
keyframe=0
duration=0.000
dts=1133.449 pts=1133.449
size=104
Пока я, наконец, не получил это сообщение
*** drop!
Я опубликовал свою ошибку в libav
http://bugzilla.libav.org/show_bug.cgi?id=67
спасибо за вашу помощь.
Ответ №1:
Попробуйте запустить avconv с более высоким уровнем журнала : -loglevel debug
. Это должно дать вам больше данных. Кроме того, попробуйте -dump
и -debug
.
Вы уверены, что это не потому, что вы нажимаете ограничение на хранилище?
Комментарии:
1. да, я почти уверен, что это не пробел в памяти, я могу запускать 10 видео одновременно, и все они останавливаются примерно на полпути. Я сбросил гигабайты с моего жесткого диска T, я выделил больше оперативной памяти для VPS. Я почти уверен, что это не проблема с пространством.
2. Звучит разумно. Вы пробовали с флагами, на которые я указал? Должно дать вам много данных для просмотра.
3. хорошо отладка на уровне журнала — отладка сбрасывает много информации, в основном блок о каждом кадре. Это совсем не замедлилось.
4. Да, это наконец остановилось, я получил сообщение о сбросе и обновил вопрос. Есть идеи, как это исправить?
Ответ №2:
Недавно я столкнулся с этим с помощью ffmpeg при преобразовании некоторых видеоклипов странного размера в «стандартные» потоки 16: 9 x264 и AAC внутри контейнера mp4. Когда появится сообщение «Несовместимый формат образца ‘s16’ для кодека ‘ac3’, автоматический выбор формата ‘flt'», мой процесс ffmpeg часто зависал бы на неопределенный срок при 100% загрузке процессора.
Я, наконец, обнаружил, что проблема, по крайней мере, в моем случае, заключалась в том, что из-за выполняемых мной преобразований (перекодирование в промежуточный формат, а затем в конечный желаемый результат), на самом деле количество каналов аудиопотока привело к зависанию процесса кодирования. Указав ffmpeg преобразовать аудиопоток в 2-канальный, я смог навсегда устранить эту проблему.
То же самое решение, вероятно, будет применимо к avconv. В мире ffmpeg (и потому, что я застрял с устаревшей версией) мне просто нужно было добавить -ac 2
в свою команду ffmpeg, и все работало отлично!
Надеюсь, это поможет 🙂