แปลง AVI (Xvid) เป็น MP4 (H.264) ที่มีคุณภาพเท่ากัน


46

ฉันต้องการบีบอัดไฟล์ 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

คำตอบ:


59

ครั้งแรกของทั้งหมดติดตั้งรุ่นล่าสุดขึ้น FFmpeg - คว้าคงสร้างจากหน้าดาวน์โหลด

การใช้vpreค่าที่ตั้งล่วงหน้า (ซึ่งเป็นวิธีการตั้งค่าเริ่มต้นสำหรับการตั้งค่าffmpegไม่ใช่การตั้งค่าตัวเข้ารหัส) ไม่จำเป็นจริงๆ โดยปกติคุณต้องการใช้-presetตัวเลือกที่กำหนดโดยโปรแกรมเปลี่ยนไฟล์

เหตุผลที่คุณได้รับคุณภาพผลผลิตต่ำมีดังต่อไปนี้สำหรับสองกรณีของคุณตามลำดับ:

  1. ในกรณีแรกที่คุณใช้crf 25เป็นค่าคงที่อัตราปัจจัยที่จะให้คุณมีคุณภาพเลวร้ายยิ่งกว่าการเริ่มต้นสำหรับการเข้ารหัส x264 (ซึ่งเป็น 23) CRF ควบคุมคุณภาพ ลองตั้งค่า CRF ที่ต่ำกว่าอาจจะ 20, 18 เป็นต้นที่นี่หมายถึงคุณภาพที่ต่ำกว่า แต่จะเพิ่มขนาดไฟล์ การเปลี่ยนแปลง 6 ใน CRF จะให้บิตเรตเฉลี่ยดั้งเดิมสองครั้ง / ครึ่งโดยประมาณ

    คุณจะต้องตั้งค่า CRF ต่ำเนื่องจากความสูญเสียรุ่น คุณกำลังเข้ารหัสสิ่งที่เข้ารหัสไว้แล้วดังนั้นคุณจึงละทิ้งข้อมูลภาพ ไม่เคยดีเลย แต่ถ้าคุณมีคุณจะต้องตั้งค่าคุณภาพสูงขึ้นเพื่อไม่ให้ลบข้อมูลมากเกินไปจากวิดีโออินพุต

  2. ในกรณีที่สองคุณกำลังพยายามกำหนดอัตราบิตคงที่ที่ 2 MBit / s วิดีโออินพุตของคุณมีอัตราบิตเดียวกันโดยประมาณ ตอนนี้ 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

9
@AhmetKa อีกตัวเลือกหนึ่งก็คือการ re-MUX ลำธารจาก AVI ภาชนะภาชนะ MP4 ffmpeg -i input.avi -c copy -map 0 output.mp4นี้: ไม่มีการเข้ารหัสซ้ำดังนั้นจึงไม่มีการสูญเสียคุณภาพ
llogan

1
@ AhmetKa ฉันควรจะกล่าวว่า muxing จะไม่ทำงานหากรูปแบบที่เก็บออกไม่รองรับรูปแบบสื่อของอินพุต ดูการเปรียบเทียบรูปแบบคอนเทนเนอร์เพื่อรับแนวคิดทั่วไปเกี่ยวกับการทำงาน
llogan

สวัสดีอีกครั้ง @slhck Crf ไม่ถูกต้อง บิตเรตความกว้างความสูง ฯลฯ ฉันสามารถคำนวณได้หรือไม่
Ahmet KAPIKIRAN

3
@hyde คุณควรเลือก-c:a aac -strict experimentalมากกว่าlibvo_aacencเพราะให้คุณภาพที่ดีกว่า
slhck
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.