Перетворіть AVI (Xvid) в MP4 (H.264), зберігаючи однакову якість


48

Я хочу стиснути AVI-файл до MP4 за допомогою кодека h.264. Я не міг отримати такої ж якості. Як я можу його стиснути?

Оригінальне відео:

Оригінальний екран відео:

Вихід консолі FFmpeg ( ffmpeg -i input.avi):

FFmpeg version SVN-r26402, Copyright (c) 2000-2011 the FFmpeg developers
  built on Dec 28 2012 10:03:40 with gcc 4.4.6 20120305 (Red Hat 4.4.6-4)
  configuration: --enable-shared --enable-gpl --enable-version3 --enable-nonfree                                                                                         --enable-pthreads --enable-x11grab --enable-libopencore-amrnb --enable-libopenc                                                                                        ore-amrwb --enable-libdc1394 --enable-libfaac --enable-libmp3lame --enable-libop                                                                                        enjpeg --enable-libspeex --enable-libtheora --enable-libvorbis --enable-libx264                                                                                         --enable-libxvid --enable-zlib --enable-filter=drawtext
  libavutil     50.36. 0 / 50.36. 0
  libavcore      0.16. 1 /  0.16. 1
  libavcodec    52.108. 0 / 52.108. 0
  libavformat   52.93. 0 / 52.93. 0
  libavdevice   52. 2. 3 / 52. 2. 3
  libavfilter    1.74. 0 /  1.74. 0
  libswscale     0.12. 0 /  0.12. 0
[mpeg4 @ 0x626b50] Invalid and inefficient vfw-avi packed B frames detected
Input #0, avi, from 'input.avi':
  Metadata:
    encoder         : VirtualDubMod 1.5.10.2 (build 2542/release)
  Duration: 01:32:38.13, start: 0.000000, bitrate: 2094 kb/s
    Stream #0.0: Video: mpeg4, yuv420p, 720x304 [PAR 1:1 DAR 45:19], 23.98 tbr,                                                                                         23.98 tbn, 23.98 tbc
    Stream #0.1: Audio: ac3, 44100 Hz, 5.1, s16, 384 kb/s
At least one output file must be specified

Тест 1

Команда FFmpeg:

ffmpeg -i input.avi -vcodec libx264 -vpre lossless_slow -crf 25 -acodec libfaac -threads 0 -t 60 1.mp4

Тест 1 Екран:

Вихід консолі FFmpeg ( ffmpeg -i 1.mp4)

    FFmpeg version SVN-r26402, Copyright (c) 2000-2011 the FFmpeg developers
  built on Dec 28 2012 10:03:40 with gcc 4.4.6 20120305 (Red Hat 4.4.6-4)
  configuration: --enable-shared --enable-gpl --enable-version3 --enable-nonfree --enable-pthreads --enable-x11grab --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libdc1394 --enable-libfaac --enable-libmp3lame --enable-libopenjpeg --enable-libspeex --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libxvid --enable-zlib --enable-filter=drawtext
  libavutil     50.36. 0 / 50.36. 0
  libavcore      0.16. 1 /  0.16. 1
  libavcodec    52.108. 0 / 52.108. 0
  libavformat   52.93. 0 / 52.93. 0
  libavdevice   52. 2. 3 / 52. 2. 3
  libavfilter    1.74. 0 /  1.74. 0
  libswscale     0.12. 0 /  0.12. 0
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '1.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    creation_time   : 1970-01-01 00:00:00
    encoder         : Lavf52.93.0
  Duration: 00:01:00.01, start: 0.000000, bitrate: 618 kb/s
    Stream #0.0(und): Video: h264, yuv420p, 720x304 [PAR 1:1 DAR 45:19], 437 kb/s, 23.98 fps, 23.98 tbr, 24k tbn, 47.95 tbc
    Metadata:
      creation_time   : 1970-01-01 00:00:00
    Stream #0.1(und): Audio: aac, 44100 Hz, 5.1, s16, 176 kb/s
    Metadata:
      creation_time   : 1970-01-01 00:00:00
At least one output file must be specified

Тест 2

Команда FFmpeg:

ffmpeg -y -i input.avi -pass 1 -vcodec libx264 -vpre slow -b 2000k -threads 0 -t 60 -f mp4 -an -y /dev/null
ffmpeg -y -i input.avi -pass 2 -vcodec libx264 -vpre slow -b 2000k -threads 0 -t 60 -acodec libfaac -ab 128k -ac 2 2.mp4

Екран тесту 2:

Вихід консолі FFmpeg ( ffmpeg -i 2.mp4)

FFmpeg version SVN-r26402, Copyright (c) 2000-2011 the FFmpeg developers
  built on Dec 28 2012 10:03:40 with gcc 4.4.6 20120305 (Red Hat 4.4.6-4)
  configuration: --enable-shared --enable-gpl --enable-version3 --enable-nonfree --enable-pthreads --enable-x11grab --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libdc1394 --enable-libfaac --enable-libmp3lame --enable-libopenjpeg --enable-libspeex --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libxvid --enable-zlib --enable-filter=drawtext
  libavutil     50.36. 0 / 50.36. 0
  libavcore      0.16. 1 /  0.16. 1
  libavcodec    52.108. 0 / 52.108. 0
  libavformat   52.93. 0 / 52.93. 0
  libavdevice   52. 2. 3 / 52. 2. 3
  libavfilter    1.74. 0 /  1.74. 0
  libswscale     0.12. 0 /  0.12. 0
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '2.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    creation_time   : 1970-01-01 00:00:00
    encoder         : Lavf52.93.0
  Duration: 00:01:00.01, start: 0.000000, bitrate: 1097 kb/s
    Stream #0.0(und): Video: h264, yuv420p, 720x304 [PAR 1:1 DAR 45:19], 1028 kb/s, 23.98 fps, 23.98 tbr, 24k tbn, 47.95 tbc
    Metadata:
      creation_time   : 1970-01-01 00:00:00
    Stream #0.1(und): Audio: aac, 44100 Hz, stereo, s16, 63 kb/s
    Metadata:
      creation_time   : 1970-01-01 00:00:00
At least one output file must be specified

Відповіді:


60

По- перше, встановити більш свіжу версію FFmpeg - захопити статичну збірку від сторінки завантаження .

Використання vpreпресетів (що є способом встановлення значень за замовчуванням для параметрів ffmpeg , а не налаштувань кодера) насправді не є необхідним; зазвичай потрібно використовувати -presetпараметри, визначені кодерами.

Причини, з яких ви отримуєте низьку якість виходу, для ваших двох випадків відповідно:

  1. У першому випадку ви використовуєте crf 25, Constant Rate Factor , який збирається дати вам гіршу якість , ніж за замовчуванням для кодера x264 (який 23). CRF контролює якість. Спробуйте встановити нижчу CRF, можливо, 20, 18 і т. Д. Тут нижчий означає кращу якість, але це збільшить розмір файлу. Зміна 6 в CRF дає вам вдвічі / наполовину початковий середній бітрейт, грубо кажучи.

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

  2. У другому випадку ви намагаєтеся встановити постійну швидкість передачі бітів у 2 Мбіт / с. Вхідне відео приблизно має однакову швидкість передачі бітів. Тепер x264 забезпечує набагато кращу візуальну якість, ніж кодер MPEG-4 Visual для того ж бітрейта, але через втрату генерації, знову ж таки, ви можете використовувати ще більший бітрейт, ніж оригінал - інакше ви стиситесь забагато інформації.

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

    x264 має режим постійної швидкості передачі, але вважається, що він поступається іншим методам кодування. Насправді двопрохідне кодування не має на меті орієнтації на оптимальну якість, тому подряпини це.

Враховуючи все, спробуйте щось із наступного:

ffmpeg -i input.avi -c:v libx264 -crf 19 -preset slow -c:a libfdk_aac -b:a 192k -ac 2 out.mp4

Якщо libfdk_aacнедоступний, використовуйте це замість цього:

ffmpeg -i input.avi -c:v libx264 -crf 19 -preset slow -c:a aac -b:a 192k -ac 2 out.mp4

Основною ручкою контролю якості буде ваше налаштування CRF. Експериментуйте з цим і використовуйте більш низьке значення, якщо вам потрібна краща якість.

Ви також можете вибрати veryslowпопередньо встановлену функцію , яка дозволить вам краще стиснутись, але кодування, очевидно, займе більше часу.

Якщо вам не вдається отримати файл гідної якості при розумному розмірі файлу, то вам не пощастить. Краще збережіть оригінальний файл таким, яким він є, без повторного кодування. Немає магічного інструменту «зберігати однакову якість», коли ви стискаєте щось, що вже стиснуте.


Якщо ваше відео має менший розмір після конверсії з двома проходами, вам потрібно вказати більш високий бітрейт. Спробуйте -b:v 3Mчи більше; але я рекомендую використовувати метод CRF замість варіанту з двома проходами.
slhck

10
@AhmetKa Іншим варіантом є просто повторно MUX потоки з AVI контейнера в контейнер MP4: ffmpeg -i input.avi -c copy -map 0 output.mp4. Не існує повторного кодування, тому немає втрати якості.
llogan

1
@AhmetKa Я мав би зазначити, що функція muxing не завжди працюватиме, якщо формат вихідного контейнера не підтримує медіаформати введення. Див. Порівняння форматів контейнерів, щоб отримати загальне уявлення про те, що працює.
llogan

Привіт знову @slhck Crf неправильно. Біт, ширина, висота тощо. Чи можу я розрахувати?
Ахмет КАПІКІРАН

3
@hyde Ви повинні віддавати перевагу -c:a aac -strict experimentalзамість цього libvo_aacenc, оскільки він забезпечує кращу якість.
slhck
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.