จะทำให้ไฟล์วิดีโอ MPEG2 มีคุณภาพสูงสุดเท่าที่จะทำได้โดยใช้ FFMPEG ได้อย่างไร?


16

ฉันมีไฟล์ WMV (v9 (WMV3), 960x720, 30.000030 fps, ภาพถ่าย 4: 2: 0 YUV, ที่ผลิตโดย PowerPoint 2010) และต้องการแปลงเป็น MPEG2 - รูปแบบเดียวที่ TVset ของฉันสามารถอ่านได้จาก USB แฟลชไดรฟ์ (ฉันยังได้ลอง MP4 / h.264, AVI / XVID - ไม่มีอะไรนอกจาก MPEG2 ใช้งานได้)

ฉันมีการจัดการเพื่องานง่าย ๆ

ffmpeg -i "in.wmv" -c:v mpeg2video "out.mpg"

แต่คุณภาพของผลลัพธ์นั้นน่าสะพรึงกลัว (แนะนำให้รู้จักการบิดเบือนภาพที่มองเห็นได้ชัดเจน) และการเล่นนั้นไม่ราบรื่น (ช้าเกินไปในบางช่วงเวลา)

ฉันได้ลองแล้ว

ffmpeg -i "in.wmv" -c:v mpeg2video -pix_fmt yuv420p -me_method epzs -threads 4 -r 30.000030 -g 45 -bf 2 -trellis 2 -cmp 2 -subcmp 2 -s 960x720 -b 2500k -bt 300k -async 1 -y "out.mpg"

(ฉันได้พบสิ่งนี้ในอินเทอร์เน็ตและปรับเปลี่ยนเล็กน้อย - เปลี่ยน resoultion, อัตราการรีเฟรชและรูปแบบผลลัพธ์ (จาก VOB เป็น MPG เปลือย)) สำเร็จ แต่คุณภาพยังแย่เกินไป

ฉันต้องใช้พารามิเตอร์อะไรเพื่อประหยัดคุณภาพให้ได้มากที่สุด อัตราการบีบอัดไม่สำคัญเลยแม้แต่การเพิ่มขนาดไฟล์ก็ยอมรับได้

สิ่งที่ฉันต้องการจริง ๆ (ฉันเลือกที่จะไม่รวมไว้ในชื่อคำถามเพื่อหลีกเลี่ยงการทำให้มันเจาะจงเกินไป แต่ฉันขอขอบคุณที่มันได้รับการพิจารณาในคำตอบ) เป็นการเพิ่มความเงียบบริสุทธิ์เป็นเสียงเพลง - ไม่มีเสียงใน ดั้งเดิม แต่ชุดทีวีบ่นเกี่ยวกับมันและฉันต้องการที่จะกำจัดเรื่องนี้ ฉันสร้างไฟล์ OGG Vorbis ความเงียบความยาวเท่ากันโดยใช้ความกล้า แต่ฉันไม่สามารถรวมมันเข้ากับวิดีโอ:

ffmpeg -i in.mpg -i silence.ogg -c:v copy -c:a libmp3lame out.mpg

และแม้แต่เปลือย

ffmpeg -i in.mpg -c:v copy -out.mpg

ให้ "บัฟเฟอร์อันเดอร์โฟลว์" และ "แพ็คเก็ตใหญ่เกินไป" ข้อผิดพลาด (in.mpg เป็นไฟล์ที่สร้างโดย FFMPEG ไบนารีเดียวกันและไฟล์ WMV แหล่งเดียวกันโดยใช้สองคำสั่งแรกในคำถาม)

ฉันใช้ Zeranoe FFMPEG บิลด์บน Windows 7


2
มีคนกำลังถามคุณเกี่ยวกับบันทึกผลลัพธ์แบบเต็ม
dstob

ทีวีชุดไหนกันแน่? มันอาจจะสามารถอ่าน H.264 ได้เพียงโปรไฟล์อื่น
slhck

@slhck ชุดทีวีคือPhilips 42PFL3606H/58ฉันกำลังเข้ารหัส H.264 ด้วยffmpeg -i "in.wmv" -sws_flags lanczos+accurate_rnd -c:v libx264 -crf 20 -preset slow -profile:v baseline -level 3.0 -pix_fmt yuv420p -tune fastdecode -x264-params keyint=240:min-keyint=20 "out.mp4"- โปรไฟล์เป็นค่าต่ำสุดที่ฉันรู้และมีการใช้ tweaks มากขึ้นเพื่อทำให้การเล่นไฟล์ที่ได้เป็นเรื่องง่ายขึ้น
Ivan

1
ตามคู่มือทีวีรองรับ MPEG-4 Visual และ H.264 หากโปรไฟล์พื้นฐานใช้งานไม่ได้ฉันไม่แน่ใจว่าจะทำอะไร แต่ทีวีค่อนข้างพิถีพิถัน
slhck

คำตอบ:


16

ปัญหาคือบิตเรตเริ่มต้นสำหรับ MPEG-2 ค่อนข้างต่ำ (เช่นเดียวกับตัวเข้ารหัสวิดีโออื่น ๆ ส่วนใหญ่ใน ffmpeg ส่วน H.264 เป็นข้อยกเว้น) วันนี้ MPEG-2 ไม่ใช่ตัวเลือกที่ดีที่สุดในฐานะตัวแปลงสัญญาณ

คุณภาพที่ดีขึ้นสำหรับ MPEG-2

คุณมีตัวเลือกน้อยถ้าคุณต้องการติดกับ MPEG-2:

  • เพิ่มบิตเรต -b:v 2500kขณะนี้คุณกำลังใช้ หากเป็นวิดีโอ HD คุณจะไม่ไปไกลเพียง 2.5 MBit / s คุณต้องการอย่างน้อยสองเท่าหรือมากกว่านั้นเพื่อให้ผลลัพธ์ดูดี -b:v 6000k -target pal-dvdยกตัวอย่างเช่นการใช้งาน

    สำหรับ 720p ฉันคิดว่าคุณควรใช้บิตเรตที่สูงขึ้น โปรดจำไว้ว่าดีวีดีใช้ MPEG-2 และมาถึง 4.7 GB เป็นเวลา 2 ชั่วโมงของภาพยนตร์ดังนั้นคุณจะได้รับประมาณ 5–8 MBit / s MPEG-2 นั้นไม่ค่อยมีประสิทธิภาพในการบีบอัดมากนักและทำงานได้ดีกว่าบิตเรตที่สูงขึ้น

  • ใช้การตั้งค่าคุณภาพเฉพาะ เปลี่ยนไป-b:v … -qscale:v 2จำนวนที่นี่มีตั้งแต่ 1 ถึง 31 และสูงกว่าหมายถึงคุณภาพที่ต่ำกว่า ไม่มีประเด็นใดที่จะเกินกว่า 4 หรือ 5 หากคุณไม่สนใจบิตเรตเริ่มต้นด้วย 2 และดูว่ามันเหมาะกับคุณหรือไม่

ล้อเล่นกับจำนวนเฟรม B, วิธีการประมาณค่าการเคลื่อนไหวหรือขนาด GOP อาจปรับคุณภาพเล็กน้อย แต่จะไม่ทำให้เกิดการเปลี่ยนแปลงครั้งใหญ่

เสียงเงียบ

ใช้-f lavfi -i aevalsrc=0เพื่อสร้างกระแสข้อมูลเสียงเงียบ ตัวอย่างเช่น:

ffmpeg -i "in.wmv" -f lavfi -i aevalsrc=0 -shortest -c:v mpeg2video -qscale:v 2 -c:a libmp3lame "out.mpg"

คุณอาจต้องเพิ่ม-target pal-dvdคำสั่งข้างต้นเพื่อบังคับขนาดบัฟเฟอร์ที่แน่นอน

ฉันเลือก MP3 เป็นตัวแปลงสัญญาณ ไฟล์ MPEG ไม่สามารถมีไฟล์เสียงนอกเหนือจาก MPEG Layer I และ II เช่นเดียวกับสตรีม PCM ดังนั้นการใช้ไฟล์ Ogg Vorbis แบบเงียบจะไม่ทำงานจนกว่าคุณจะแปลงไฟล์เสียงด้วย (ซึ่งไม่ใช่สิ่งที่คุณทำเมื่อใช้-c:a copy) .

ใช้ตัวแปลงสัญญาณวิดีโอที่แตกต่างกัน

ฉันประหลาดใจที่ทีวีที่เล่นไฟล์วิดีโอจะอ่าน MPEG-2 แต่ไม่ใช่อย่างอื่น ควรสนับสนุนวิดีโออย่างน้อยMPEG-4 Part II (นั่นคือสิ่งที่คุณรู้ว่าเป็น "DivX" - ตัวเข้ารหัส MPEG-4 Part II) ดังนั้นคุณสามารถลอง:

ffmpeg -i "in.wmv" -f lavfi -i aevalsrc=0 -shortest -c:v libxvid -qscale:v 2 -c:a libmp3lame "out.mp4"

ทีวีของคุณอาจรองรับ H.264 เช่นกัน แต่มีเพียงบางโปรไฟล์เท่านั้น ลองใช้baselineโปรไฟล์เช่น:

ffmpeg -i "in.wmv" -f lavfi -i aevalsrc=0 -shortest -c:v libx264 -profile:v baseline -crf 23 -c:a aac -strict experimental "out.mp4"

ในตัวอย่างข้างต้นที่ผมเคยใช้ตัวเลือก CRF qscaleในการกำหนดคุณภาพแทน ดูคู่มือการเข้ารหัส H.264เพิ่มเติม


"การใช้จำนวนเฟรม B วิธีการประมาณความเคลื่อนไหวหรือขนาด GOP อาจทำให้คุณภาพของภาพบิดเบี้ยวเล็กน้อย แต่จะไม่ส่งผลให้เกิดการเปลี่ยนแปลงครั้งใหญ่" - ฉันจะทำให้เฟรมทุกเฟรมเป็น B และไม่ใช้การประมาณการเคลื่อนไหวด้วย MPEG2 ได้ไหม? วิดีโอมีส่วนไดนามิกมากมาก
อีวาน

ฉันได้พยายามบรรทัดคำสั่งแรกที่คุณแนะนำ ( ffmpeg -i "in.wmv" -f lavfi -i aevalsrc=0 -shortest -c:v libxvid -qscale:v 2 -c:a libmp3lame "out.mp4") - มัน encodes ประมาณ 100 เฟรมและจากนั้นก็เริ่มน้ำท่วมหน้าจอที่มีข้อผิดพลาดเช่นและ[mpeg @ 02f69ba0] buffer underflow i=0 bufi=235538 size=239761 [mpeg @ 02f69ba0] packet too large, ignoring buffer limits to mux it
อีวาน

@Ivan -b:vคุณสามารถเปลี่ยนบิตเรตที่มี เพิ่มเข้าไปในคำตอบของฉัน เกี่ยวกับการตั้งค่าโปรแกรมเปลี่ยนไฟล์: คุณไม่สามารถทำให้ทุกเฟรมเป็น B-frame ได้ นอกจากนี้คุณต้องมีการประมาณการเคลื่อนไหว - ยิ่งละเอียดมากเท่าไหร่ก็ยิ่งบีบอัดได้ดีเท่านั้น แต่ถ้าเป็นวิดีโอแบบไดนามิกสิ่งแรกที่คุณจะต้องการก็คือการเพิ่มบิตเรตอย่างมาก การตั้งค่าการเข้ารหัสจริงๆไม่ได้มีมากของผลกระทบ สำหรับข้อผิดพลาดของคุณคุณแน่ใจหรือว่านี่เป็นข้อผิดพลาดของคำสั่งที่ถูกต้อง? [mpeg]ข้อผิดพลาดสามารถเกิดขึ้นได้เฉพาะในกรณีที่ไฟล์ที่ส่งออกของคุณจะไม่ได้เมื่อมันเป็น.mpg .mp4
slhck

ฉันได้คัดลอก = วางส่วนที่ไม่ถูกต้องแล้ว @slhck ฉันกำลังใช้งานอยู่ffmpeg -i "in.wmv" -f lavfi -i aevalsrc=0 -shortest -c:v mpeg2video -qscale:v 2 -c:a libmp3lame "out.mpg"แน่นอน
อีวาน

1
-target pal-dvdแก้ปัญหาไม่-bufsizeทำงาน (ฉันลองแล้ว-b:v 7M -bufsize 7M -maxrate 7M)
อีวาน

0

ฉันจะบอกทันทีว่าขนาดไฟล์ไม่สำคัญจริงๆแล้วให้ทดลองเพิ่มอัตราบิต

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

ffmpeg.exe -f lavfi -i aevalsrc=0:0::duration=YOUR_DESIRED_DURATION -ab 10k YourAudioName.aac

วิธีนี้ใช้ไม่ได้ผลเนื่องจากคุณใช้ mpg container ดังนั้นคุณอาจต้องลอง (mp3 container)

ffmpeg.exe -f lavfi -i aevalsrc=0:0::duration=YOUR_DESIRED_DURATION -ab 10k YourAudioName.mp3

ดูเหมือนว่าจะทำงานให้ฉัน


ไม่จำเป็นต้องตั้งค่าระยะเวลาเนื่องจาก ffmpeg จะใช้สิ่งที่จำเป็นสำหรับวิดีโอ
slhck

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