แก้ไขอัตราส่วนภาพโดยไม่ต้องเข้ารหัสไฟล์วิดีโออีกครั้ง


18

ฉันมีวิดีโอสตรีมพร้อมคุณสมบัติต่อไปนี้:

Stream #0:0: Video: mpeg4 (Advanced Simple Profile) (XVID / 0x44495658), yuv420p, 720x416 [SAR 1:1 DAR 45:26], 1908 kb/s, 25 fps, 25 tbr, 25 tbn, 25 tbc

เมื่อฉันเรียกใช้ใน VLC ฉันต้องกด "A" เพื่อเปลี่ยนอัตราส่วนภาพเป็น "4: 3" เพื่อให้วิดีโอแสดงด้วยอัตราส่วนภาพที่ถูกต้อง

เมื่อดูข้อเท็จจริงของวิดีโอข้อผิดพลาดที่ก) วิดีโอจริงนั้นถูกยืดออกอย่างไม่ถูกต้องในข้อมูลพิกเซลหรือข) มีเพียงเมทาดาทาบางค่าที่ตั้งค่าไว้ไม่ถูกต้องหรือไม่

หากก่อนหน้านี้ฉันรู้ว่าฉันสามารถเข้ารหัสวิดีโออีกครั้งและเปลี่ยนความกว้างและความสูงได้ แต่ถ้าในภายหลังคำสั่ง ffmpeg อะไรที่ฉันเรียกใช้เพื่อแก้ไขข้อมูลเมตาโดยไม่ต้องเข้ารหัสวิดีโออีกครั้ง

คำตอบ:


36

มีความแตกต่างระหว่างอัตราส่วนภาพตัวอย่าง (SAR) และอัตราส่วนภาพแสดง (DAR) หากคุณต้องการเปลี่ยนวิดีโอให้แสดงที่ 4: 3 คุณจะต้องเปลี่ยนพิกเซลจริงในภาพ (โดยการปรับขนาดพิกเซลและเปลี่ยน SAR) หรือโดยการตั้งค่าสถานะเมตาดาต้าที่ระดับคอนเทนเนอร์ที่บอกภายนอก เครื่องเล่นสื่อที่จะขยายภาพไปยัง DAR ที่คุณต้องการ

คุณจะไม่สามารถปรับขนาดพิกเซลและเปลี่ยน SAR โดยไม่ต้องใช้ตัวกรองวิดีโอ หากคุณเลือกวิธีนี้คุณจะต้องแปลงรหัสไฟล์เนื่องจากคุณไม่สามารถ "สตรีมคัดลอก" สตรีมวิดีโอในขณะที่ใช้ตัวกรองวิดีโอ

หากต้องการปรับขนาดภาพและเปลี่ยน SAR (ขณะแปลงรหัส) ให้ลอง:

ffmpeg -i <INPUT_FILE> -vf scale=720:540 -c:v <Video_Codec> <OUTPUT_FILE>

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

ffmpeg -i <INPUT_FILE> -aspect 720:540 -c copy [OUTPUT_FILE]

ยอดเยี่ยม การเปลี่ยนมุมมองใช้งานได้ทันที!
comerin

2
คุณไม่สามารถใช้-c copyและปรับขนาดได้ในเวลาเดียวกัน อย่างไรก็ตามคุณสามารถใช้-aspectเพื่อเปลี่ยนอัตราส่วนที่ระดับคอนเทนเนอร์ (แต่ไม่ใช่ระดับสตรีม)
llogan

@ LordNeckbeard การใช้-aspectงานจะสามารถเล่นffplayได้ แต่ไม่ใช่ใน WMP หรือ MPC-HC มันเพิ่มรายการ SAR / DAR Stream #…เพิ่มเติมลงในบรรทัดข้อมูลFFmpeg/probe/playแต่ดูเหมือนจะไม่เป็นทางออกสำหรับการเล่นทั่วไป การยืดวิดีโอด้วยหน้าต่างดูเหมือนจะเป็นทางออกที่ง่ายที่สุดสำหรับการเล่น MPC-HC
Lumi

ไม่ทำงานสำหรับฉันสำหรับ MPEG2 โดยไม่ต้องเข้ารหัสใหม่
Mikhail V

ฉันไม่รู้ว่าทำไมมันไม่ทำงานสำหรับฉัน มันแค่เอาท์พุตวิดีโอเดียวกัน!
Tina J

4

คำตอบของ Delgadoนั้นถูกต้องที่ MP4Box สามารถทำได้ แต่-parตัวเลือกไม่ทำงานอย่างที่อธิบายไว้ ด้วย-outพารามิเตอร์ (เพื่อไม่ให้รบกวนไฟล์ต้นฉบับของคุณ):

mp4box source.mp4 -out target.mp4 -par stream-number=width:height

เมื่อคุณใช้-par stream-number=width:heightคุณกำหนดอัตราส่วนพิกเซลนั่นคือผลลัพธ์ของการหารอัตราส่วนกว้างยาวของอุปกรณ์ด้วยอัตราส่วนกว้างยาวของหน่วยเก็บ (เท่ากับคุณกำลังอธิบายอัตราส่วนของพิกเซลแหล่งที่มา) ตัวอย่างเช่นสมมติว่าคุณมีแหล่งดีวีดีที่ 720 × 480 และอัตราส่วนการแสดงผลที่ถูกต้องคือ 4: 3 สำหรับกรณีนี้คุณต้อง:

mp4box source.mp4 -out target.mp4 -par 1=8:9

เพราะ (4/3) / (720/480) = 8/9

หากแหล่งที่มาหมายถึงพิกเซล SD NTSC จริง (ซึ่งในกรณีนี้ควรจะแมปกลาง 704 × 480 พิกเซลไปที่หน้าจอขนาด 4 × 3 โดยมี 8 พิกเซลที่สแกนบนทั้งสองด้าน) คำสั่งที่ถูกต้องจะเป็น:

mp4box source.mp4 -out target.mp4 -par 1=10:11

เพราะ (4/3) / (704/480) = 10/11 - แน่นอนว่าอัตราส่วนพิกเซลสำหรับการอ้างอิงสำหรับวิดีโอความคมชัดมาตรฐาน NTSC

สำหรับกรณีที่ระบุในคำถามหากเป็นจริง 4: 3 นั่นจะให้อัตราส่วนพิกเซลที่แปลกมาก: (4/3) / (720/416) = 104/135 กว้าง 720 ซึ่งแนะนำแหล่ง DVD; มันเป็นวิดีโอ 25 fps แนะนำ PAL แต่ PAR ทำผลงานได้น้อยกว่า 1 แนะนำ NTSC อาจเป็น 4: 5 ฉันคิดว่า (ใกล้มากถึง 104: 135) แต่ฉันไม่รู้อะไรเลยที่ทำให้อัตราส่วนพิกเซลนั้น อาจลองก่อนแล้วลอง 3: 4 ถ้ามันยังยืดอยู่เล็กน้อยในแนวนอน หากคุณแน่ใจว่ามันแน่นอน 4: 3 เพียงใช้ 104: 135


3

ffmpeg ไม่สามารถเปลี่ยนพารามิเตอร์ของสตรีมวิดีโอโดยไม่ต้องเข้ารหัสใหม่ MP4Box (ส่วนหนึ่งของgpac ) และ mkvmerge สามารถ ในกรณีที่สตรีมวิดีโอหนึ่งรายการและอัตราส่วนภาพที่ถูกต้อง / จริงเป็น 4: 3 คุณอาจต้องการลอง:

MP4Box -par 1=3:4 VideoFile.mp4

    "-par" : PixelAspectRatio (adjusts DAR + SAR with respect to the video resolution)
    "1"=   : stream number
    "3:4"  : aspect ratio (lower number 1st!)
    Changes are directly applied to "VideoFile.mp4", no copy

วิธีตรวจสอบก่อนและหลัง: ffmpeg -i VideoFile.mp4


0

เปลี่ยนSARโดยไม่ต้อง reencoding ยังทำงานร่วมกับffmpegใน.mp4การใช้h264_metadataเป็นเกียงชี้ให้เห็นที่นี่ :

ffmpeg -i in.mp4 -c copy -bsf:v "h264_metadata=sample_aspect_ratio=4/3" out.mp4

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