ทำไมการแปลง 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คุณไม่ได้เข้ารหัสอะไรเลย คุณมีฮาร์ดแวร์อะไรเช่น CPU ระบบปฏิบัติการของคุณและรุ่น FFmpeg คืออะไร
slhck

@slhck: คอมพิวเตอร์ไม่เร็วมาก E5400 2.7GHz แต่ทำไมมันช้าสำหรับ mp4 ในขณะที่มันเร็วสำหรับ avi?
Giorgi

ฉันไม่เห็นผลลัพธ์ AVI ใด ๆ ในคำถามของคุณ คุณสามารถอัปเดตด้วยเอาต์พุตเต็มรูปแบบได้หรือไม่
slhck

@slhck: เพิ่มเอาท์พุต avi
Giorgi

คำตอบ:


17

การคัดลอกสตรีม

เมื่อคุณโทร-c:v:1 copy, FFmpeg จะใช้ bitstream วิดีโอที่มีอยู่และกระแสคัดลอกมัน วิดีโอบิตสตรีมถูกห่อหุ้มไว้ในที่เก็บภายนอกเช่น WMV, AVI หรือ MP4 - บิตสตรีมวิดีโอจริงของคุณคือmsmpeg4และจะอยู่ในลักษณะนี้

หากคุณต้องการทราบข้อมูลเพิ่มเติมเกี่ยวกับสิ่งที่ฉันกำลังพูดถึงให้ดูที่นี่: ตัวแปลงสัญญาณ (เช่น DivX คืออะไร) และแตกต่างจากรูปแบบไฟล์ (เช่น MPG) อย่างไร

เมื่อคัดลอกบิตสตรีม FFmpeg ไม่จำเป็นต้องถอดรหัสจริงและเข้ารหัสวิดีโอจริงอีกครั้ง เพียงแค่ต้องการรวมบิตสตรีมวิดีโอเป็นรูปแบบคอนเทนเนอร์ใหม่ซึ่งมักจะเป็นการดำเนินการที่ค่อนข้างง่ายและใช้เวลาไม่นาน

การเข้ารหัส

ตรงกันข้ามถ้าคุณเรียกใช้-vcodec libx264(หรือ-c:v libx264ไวยากรณ์ที่คุณควรใช้เนื่องจากvcodecเลิกใช้แล้ว) FFmpeg จะถูกบังคับให้ถอดรหัสวิดีโอบิตสตรีมจากmsmpeg4เป็นรูปแบบ raw จากนั้นไพพ์ลงในx264ตัวเข้ารหัส H.264

x264 เร็ว แต่การเข้ารหัสวิดีโอต้องใช้เวลา - โดยเฉพาะเมื่อเนื้อหา 720p และอาจใช้เวลามากกว่าหนึ่งชั่วโมงโดยเฉพาะถ้าข้อมูลของคุณมีความยาวมากกว่าหนึ่งชั่วโมง นอกจากนี้ CPU ของคุณอาจไม่เร็วที่สุด นี่คือเหตุผลหลักที่ทำให้โปรแกรมเข้ารหัส MPEG-4 Visual รุ่นเก่าอย่าง XviD ยังคงอยู่และเป็นที่นิยมมาก: ใช้เวลาในการเข้ารหัสน้อยกว่าตัวแปลงสัญญาณ H.264 อาจไม่ให้ประสิทธิภาพที่ดีที่สุดในแง่ของคุณภาพเทียบกับขนาดไฟล์ แต่ก็เร็ว

สิ่งที่กล่าวมาทั้งหมด: คุณสามารถเพิ่มความเร็วในการเข้ารหัส x264 โดยบังคับให้ตั้งค่าล่วงหน้า ค่าที่ตั้งล่วงหน้าเป็นการตั้งค่าการเพิ่มประสิทธิภาพของตัวเข้ารหัสและช่วงจาก: เร็วมากเร็วสุดเร็วมากเร็วเร็วปานกลางช้าช้าช้ามาก คำสั่งของคุณอาจมีลักษณะเช่นนี้:

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

ควรวิ่งเร็วกว่าที่ไม่มีการตั้งค่าไว้ล่วงหน้า -preset veryslowคืนเดียวก็คือว่ามันไม่ได้ประสบความสำเร็จเป็นที่มีคุณภาพที่ดีสำหรับอัตราการบีบอัดเดียวกันในการเปรียบเทียบกับตัวอย่างเช่น

นอกจากนั้นยังมีอะไรที่คุณทำได้ไม่มากนักยกเว้นการลงทุนใน CPU ที่รวดเร็วและทำให้แน่ใจว่าคุณกำลังใช้ FFmpeg รุ่นล่าสุดพร้อมด้วยการรองรับ x264

สำหรับข้อมูลเพิ่มเติมโปรดดูที่FFmpeg วิกิพีเดีย: H.264 เข้ารหัสคู่มือ


ขอบคุณสำหรับคำตอบ. ฉันไม่แน่ใจว่าฉันชัดเจนหรือไม่ แต่ถ้าฉันใช้การคัดลอกมันยังช้ามาก ฉันลองใช้คำสั่งของคุณและมันได้ประมวลผลเพียง 4 วินาทีหลังจาก 5 นาที วิดีโอของฉันยาวประมาณ 75 นาทีและการแปลงเป็น avi ใช้เวลาเพียง 15 นาที แต่ mp4 ใช้เวลาหลายชั่วโมง
Giorgi

แล้วอันไหนดีที่สุดสำหรับการเข้ารหัส, libx264 หรือ h264?
Yohanes AI

@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 เป็น lossless จาก lossless เป็น MP4 จะทำการแปลงแบบเต็มในเวลาไม่นาน แต่คุณต้องการพื้นที่ HDD 100 เท่าเพื่อเก็บรุ่นที่ไม่สูญเสียซึ่งเจ็บปวด

ดังนั้นปรากฎว่าคุณสามารถเลือกจากการแปลง WMV-> MP4 รุ่นที่ช้ามากหรือช้ามากและคุณไม่มีทางเลือกอื่น

การแปลง WMV เป็น lossless AVI: ffmpeg.exe -i screen.wmv -vcodec ffv1 screen.avi จากนั้นแปลง AVI lossless เป็น MP4 (หรือ WebM มันไม่สำคัญ) ffmpeg.exe -i screen.avi screen.mp4

เร็วมาก!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.