Почему конвертация WMV в MP4 такая медленная?

19910
Giorgi

Я пытаюсь конвертировать видео из WMV в MP4 с помощью FFmpeg, но это занимает пару часов. Если я пытаюсь преобразовать его в AVI, это займет около 10-15 минут.

версия ffmpeg

ffmpeg version N-43206-gf857465 built on Aug 4 2012 16:10:39 with gcc 4.7.1 (GCC) 

Преобразование в MP4

ffmpeg -i input.wmv -vcodec libx264 output.mp4  libavutil 51. 66.100 / 51. 66.100 libavcodec 54. 49.100 / 54. 49.100 libavformat 54. 22.100 / 54. 22.100 libavdevice 54. 2.100 / 54. 2.100 libavfilter 3. 5.102 / 3. 5.102 libswscale 2. 1.100 / 2. 1.100 libswresample 0. 15.100 / 0. 15.100 libpostproc 52. 0.100 / 52. 0.100 Input #0, asf, from 'input.wmv': Metadata: WMFSDKVersion : 12.0.7601.17514 WMFSDKNeeded : 0.0.0.0000 IsVBR : 0 encoder : Lavf54.22.100 Duration: 01:14:23.06, start: 0.000000, bitrate: 324 kb/s Stream #0:0: Video: msmpeg4 (MP43 / 0x3334504D), yuv420p, 1280x720, 15 tbr, 1k tbn, 1k tbc [libx264 @ 03427620] using cpu capabilities: MMX2 SSE2Fast SSSE3 FastShuffle Cac he64 [libx264 @ 03427620] profile High, level 3.1 [libx264 @ 03427620] 264 - core 125 r2208 d9d2288 - H.264/MPEG-4 AVC codec - Cop yleft 2003-2012 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deb lock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 m e_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chro ma_qp_offset=-2 threads=3 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 i nterlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=15 scenec ut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin= 0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00 Output #0, mp4, to 'output.mp4': Metadata: WMFSDKVersion : 12.0.7601.17514 WMFSDKNeeded : 0.0.0.0000 IsVBR : 0 encoder : Lavf54.22.100 Stream #0:0: Video: h264 ([33][0][0][0] / 0x0021), yuv420p, 1280x720, q=-1-- 1, 15 tbn, 15 tbc Stream mapping: Stream #0:0 -> #0:0 (msmpeg4 -> libx264) 

Преобразование в MP4 с copy

ffmpeg -i input.wmv -c:v:1 copy output.mp4  libavutil 51. 66.100 / 51. 66.100 libavcodec 54. 49.100 / 54. 49.100 libavformat 54. 22.100 / 54. 22.100 libavdevice 54. 2.100 / 54. 2.100 libavfilter 3. 5.102 / 3. 5.102 libswscale 2. 1.100 / 2. 1.100 libswresample 0. 15.100 / 0. 15.100 libpostproc 52. 0.100 / 52. 0.100 Input #0, asf, from 'input.wmv': Metadata: WMFSDKVersion : 12.0.7601.17514 WMFSDKNeeded : 0.0.0.0000 IsVBR : 0 encoder : Lavf54.22.100 Duration: 01:14:23.06, start: 0.000000, bitrate: 324 kb/s Stream #0:0: Video: msmpeg4 (MP43 / 0x3334504D), yuv420p, 1280x720, 15 tbr, 1k tbn, 1k tbc [libx264 @ 03437620] using cpu capabilities: MMX2 SSE2Fast SSSE3 FastShuffle Cac he64 [libx264 @ 03437620] profile High, level 3.1 [libx264 @ 03437620] 264 - core 125 r2208 d9d2288 - H.264/MPEG-4 AVC codec - Cop yleft 2003-2012 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deb lock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 m e_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chro ma_qp_offset=-2 threads=3 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 i nterlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=15 scenec ut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin= 0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00 Output #0, mp4, to 'output.mp4': Metadata: WMFSDKVersion : 12.0.7601.17514 WMFSDKNeeded : 0.0.0.0000 IsVBR : 0 encoder : Lavf54.22.100 Stream #0:0: Video: h264 ([33][0][0][0] / 0x0021), yuv420p, 1280x720, q=-1-- 1, 15 tbn, 15 tbc Stream mapping: Stream #0:0 -> #0:0 (msmpeg4 -> libx264) 

Преобразование в AVI с copy

ffmpeg -i input.wmv -c:v:1 copy output.avi  Input #0, asf, from 'input.wmv': Metadata: WMFSDKVersion : 12.0.7601.17514 WMFSDKNeeded : 0.0.0.0000 IsVBR : 0 encoder : Lavf54.22.100 Duration: 01:14:23.06, start: 0.000000, bitrate: 324 kb/s Stream #0:0: Video: msmpeg4 (MP43 / 0x3334504D), yuv420p, 1280x720, 15 tbr, 1k tbn, 1k tbc Output #0, avi, to 'output.avi': Metadata: WMFSDKVersion : 12.0.7601.17514 WMFSDKNeeded : 0.0.0.0000 IsVBR : 0 ISFT : Lavf54.22.100 Stream #0:0: Video: mpeg4 (FMP4 / 0x34504D46), yuv420p, 1280x720, q=2-31, 20 0 kb/s, 15 tbn, 15 tbc Stream mapping: Stream #0:0 -> #0:0 (msmpeg4 -> mpeg4) 

Есть ли дополнительные параметры, которые мне нужно передать?

10
Конечно, быстрее, если вы просто копируете поток битов - с помощью `copy` вы ничего не перекодируете. Какое оборудование у вас есть, например, процессор? Какая у вас ОС и какая версия FFmpeg? slhck 11 лет назад 0
@slhck: компьютер не очень быстрый E5400 2.7GHz, но почему он медленный для mp4, а для avi быстрый? Giorgi 11 лет назад 0
Я не вижу вывода AVI в вашем вопросе. Не могли бы вы обновить его с полным выходом? slhck 11 лет назад 0
@slhck: добавлен вывод AVI Giorgi 11 лет назад 0

2 ответа на вопрос

16
slhck

Потоковое копирование

Когда вы звоните -c:v:1 copy, FFmpeg возьмет существующий битовый поток видео и скопирует его в поток . Битовый поток видео просто инкапсулируется во внешний контейнер, например, WMV, AVI или MP4 - ваш реальный битовый поток видео есть msmpeg4и останется таким.

Если вы хотите узнать больше о том, о чем я говорю, смотрите здесь: Что такое кодек (например, DivX?) И чем он отличается от формата файла (например, MPG)?

При копировании потока битов FFmpeg не нужно фактически декодировать и перекодировать реальное видео. Просто нужно объединить видеопоток в новый формат контейнера, что часто является довольно простой операцией и поэтому не занимает много времени.

кодирование

В отличие от этого, если вы вызываете -vcodec libx264(или -c:v libx264синтаксис, который вы должны использовать, потому что vcodecон устарел), FFmpeg будет вынужден декодировать битовый поток видео из msmpeg4необработанного формата, а затем передавать его в x264кодер H.264.

x264 работает быстро, но кодирование видео все равно занимает много времени, особенно когда его содержимое 720p. И это может занять более одного часа, особенно если ваш ввод уже более одного часа. Кроме того, ваш процессор может быть не самым быстрым. Это основная причина, по которой старые кодеры MPEG-4 Visual, такие как XviD, все еще популярны: им требуется меньше времени для кодирования, чем кодекам H.264. Они могут не дать вам лучшую производительность с точки зрения качества и размера файла, но они быстры.

Это все, как говорится: вы можете ускорить кодирование x264, форсируя пресет. Пресеты представляют собой настройки оптимизации кодировщика и варьируются от: сверхбыстрый, сверхбыстрый, очень быстрый, быстрый, быстрый, средний, медленный, медленный, очень низкий. Ваша команда может выглядеть так:

ffmpeg -i input.wmv -c:v libx264 -preset ultrafast out.mp4 

Он должен работать быстрее, чем без предустановки. Единственный недостаток заключается в том, что он не достигает такого же качества при тех же скоростях сжатия по сравнению, например, с -preset veryslow.

Кроме того, вы ничего не можете сделать, кроме как инвестировать в быстрый ЦП и убедиться, что вы используете последнюю сборку FFmpeg с поддержкой x264.

Для получения дополнительной информации см. FFmpeg Wiki: Руководство по кодированию H.264 .

Спасибо за ответ. Я не уверен, был ли я ясен или нет, но если я использую копирование, это все еще очень медленно. Я попробовал вашу команду, и она обработала только 4 секунды через 5 минут. Мое видео длится около 75 минут, а конвертация в avi занимает всего 15 минут, а mp4 - несколько часов. Giorgi 11 лет назад 0
Итак, какой из них лучше всего подходит для кодирования, libx264 или h264? Yohanes AI 5 лет назад 0
@NPE Нет разницы, так как ffmpeg по умолчанию использует `libx264`, когда вы задаете ´h264` в качестве кодировщика. slhck 5 лет назад 0
@slhck Когда я пытаюсь использовать этот параметр, `-y -i fileSource -s 1920x1080 -vcodec libx264 crf 20 fileOutput` занимает больше часа. Чтобы сделать это быстрее, какой параметр рекомендации я должен добавить на основе вашего опыта? Достаточно ли параметра `-preset fast`? Yohanes AI 5 лет назад 0
@NPE Единственный способ сделать это быстрее (с тем же аппаратным обеспечением) - это использовать более быстрый пресет, да, например, `-preset быстрее`. slhck 5 лет назад 0
@slhck Можно ли использовать многопоточность или, если возможно, графическую карту, чтобы сделать ее быстрее? Yohanes AI 5 лет назад 0
@NPE Многопоточность уже включена, но кодирование не может быть легко распараллелено таким образом. Доступно несколько аппаратно-ускоренных кодеров, см. Https://trac.ffmpeg.org/wiki/HWAccelIntro - проще всего будет NVIDIA. slhck 5 лет назад 0
2
Marcell Foti

Поскольку я играл (бесконечные часы) с конвертацией WMV-> MP4, я нашел сверхбыстрый способ сделать это. Но у него есть цена: цена хранения. Если вы конвертируете WMV в без потерь, то из без потерь в MP4, он делает полное преобразование в кратчайшие сроки. Но вам нужно в 100 раз больше места на жестком диске для хранения версии без потерь, что очень болезненно.

Таким образом, оказывается, что вы можете выбрать одну из очень медленных или очень жестких версий конвертации WMV-> MP4, и у вас нет другого выбора.

Преобразование WMV в AVI без потерь: ffmpeg.exe -i screen.wmv -vcodec ffv1 screen.avi Затем преобразование AVI без потерь в MP4 (или WebM, это не имеет значения) ffmpeg.exe -i screen.avi screen.mp4

Сверх быстрый!

Похожие вопросы