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

12

Я пытаюсь конвертировать видео из 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)

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

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

Ответы:

17

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

Когда вы звоните -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 fast out.mp4

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

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

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

slhck
источник
Спасибо за ответ. Я не уверен, был ли я ясен или нет, но если я использую копирование, это все еще очень медленно. Я попробовал вашу команду, и она обработала только 4 секунды через 5 минут. Мое видео длится около 75 минут, а конвертация в avi занимает всего 15 минут, а mp4 - несколько часов.
Георгий
Итак, какой из них лучше для кодирования, libx264 или h264?
Йоханес А.И.
@NPE Нет никакой разницы, поскольку ffmpeg по умолчанию использует, libx264когда вы указываете «h264» в качестве кодировщика.
Slhck
1
@PeterCordes Я изменил его на fast. Немного интересной статистики (если VMAF можно доверять здесь): streaminglearningcenter.com/blogs/…
slhck
1
@PeterCordes Существует несколько оптимизаций RC, которые VMAF плохо обрабатывает, например, AQ: github.com/Netflix/vmaf/issues/21 . Я согласен с высококачественной 1080p против дерьмовой UHD части. Автор блога очень открыт для предложений о том, как улучшить его тестирование; Я уже прокомментировал некоторую неправильную конфигурацию для x265 некоторое время назад.
slhck
3

Поскольку я играл (бесконечные часы) с конвертацией 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

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

Марсель Фоти
источник