Чому перетворення 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, форсуючи попередньо встановлену програму. Пресети - це параметри оптимізації кодера і варіюються від: ультрашвидкий, надшвидкий, дуже швидкий, швидкий, швидкий, середній, повільний, повільніше, вейслоlow. Тоді ваша команда може виглядати так:

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

Він повинен працювати швидше, ніж без попередньо встановленого. Єдиний недолік полягає в тому, що він не досягає настільки ж хорошої якості для тих же показників стиснення порівняно, наприклад, як -preset veryslow.

Крім цього, ви не можете багато чого зробити, крім інвестицій у швидкий процесор, і переконайтеся, що ви працюєте з недавньою збіркою FFmpeg з підтримкою x264.

Для отримання додаткової інформації див. FFmpeg Wiki: Посібник з кодування H.264 .


Дякую за відповідь. Я не впевнений, чи мені це було зрозуміло чи ні, але якщо я використовую копію, це все ще дуже повільно. Я спробував вашу команду, і вона обробила лише 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/isissue/21 . Я погоджуюся з якісною частиною UHD 1080p проти хитрої. Автор блогу дуже відкритий до пропозицій щодо покращення його тестування; Я вже коментував деяку неправильну конфігурацію для 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

Супершвидкий!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.