ทำไม Quicktime ไม่สามารถเล่นไฟล์ภาพยนตร์ที่เข้ารหัสโดย FFmpeg ได้? [ซ้ำ]


34

เมื่อฉันพยายามเปิดภาพยนตร์ฉันเพิ่งสร้างด้วยคำสั่ง:

ffmpeg -pattern_type glob -i '*.JPG' -s 640x480 movie.mp4

ฉันได้รับข้อผิดพลาดจาก QuickTime:

The document “movie.mp4” could not be opened.
The file may be damaged or may not be a movie file that is compatible with QuickTime Player.

ฉันใช้คำสั่งเดียวกันกับชุดของภาพที่สร้างขึ้นจาก iSight time lapse แต่ในกรณีนี้ภาพข้างบนมาจากกล้องดิจิตอล ความละเอียดสูงกว่ามาก แต่ฉันปรับขนาดเป็น 640x480 และฉันไม่เห็นอะไรเลยในผลลัพธ์ที่แสดงถึงปัญหา:

Input #0, image2, from '*.JPG':
  Duration: 00:00:04.76, start: 0.000000, bitrate: N/A
    Stream #0:0: Video: mjpeg, yuvj422p(pc), 4928x3264, 25 tbr, 25 tbn, 25 tbc

เทียบกับภาพยนตร์ที่ทำงาน:

Input #0, image2, from '*.JPG':
  Duration: 00:01:23.72, start: 0.000000, bitrate: N/A
    Stream #0:0: Video: mjpeg, yuvj420p(pc), 640x480 [SAR 1:1 DAR 4:3], 25 fps, 25 tbr, 25 tbn, 25 tbc

และสำหรับผลลัพธ์:

Output #0, mp4, to 'movie.mp4':
  Metadata:
    encoder         : Lavf55.19.104
    Stream #0:0: Video: h264 (libx264) ([33][0][0][0] / 0x0021), yuvj422p, 640x480, q=-1--1, 12800 tbn, 25 tbc
Stream mapping:
  Stream #0:0 -> #0:0 (mjpeg -> libx264)

เทียบกับการทำงานอย่างใดอย่างหนึ่ง:

Output #0, mp4, to 'movie.mp4':
  Metadata:
    encoder         : Lavf55.19.104
    Stream #0:0: Video: h264 (libx264) ([33][0][0][0] / 0x0021), yuvj420p, 640x480 [SAR 1:1 DAR 4:3], q=-1--1, 12800 tbn, 25 tbc
Stream mapping:
  Stream #0:0 -> #0:0 (mjpeg -> libx264)

นอกเหนือจากภาพยนตร์ที่ใช้งานได้นานขึ้นและความละเอียดของแหล่งที่มาต่ำกว่าความแตกต่างเดียวที่ฉันเห็นคือมี "[SAR 1: 1 DAR 4: 3]" พิเศษที่กล่าวถึงในสตรีมวิดีโอ แต่ฉันไม่รู้ว่านี่คืออะไร คือหรือวิธีการพยายามบังคับใช้ในภาพยนตร์ที่ไม่ทำงาน

อัปเดต: ฉันเพิ่งดาวน์โหลด VLC และเล่นภาพยนตร์ได้ดี ดังนั้นฉันรู้ว่า ffmpeg ไม่ใช่ความผิดที่นี่


2
สำหรับอนาคตเมื่อถามเกี่ยวกับ ffmpeg โปรดรวมเอาท์พุทบรรทัดคำสั่งเต็มรูปแบบที่ไม่ได้เจียระไนไว้เสมอ มันควรจะบอกคุณบางอย่างเกี่ยวกับรูปแบบพิกเซลที่เข้ากันไม่ได้กับผู้เล่นบางคนถ้าฉันไม่ผิด (และถ้าคุณมีเวอร์ชั่นล่าสุด)
slhck

ffprobe video.mp4สามารถใช้เพื่อตรวจสอบรูปแบบพิกเซลที่ใช้
l --marc l

คำตอบ:


47

จากนี้คำตอบ StackOverflowฉันจะเพิ่ม-pix_fmt yuv420pคำสั่งของคุณเช่นนี้; หนึ่งในความคิดเห็นกล่าวถึงการเพิ่ม-vcodec libx264เช่นกันดังนั้นมันรวมอยู่ที่นี่:

ffmpeg -pattern_type glob -i '*.JPG' -vcodec libx264 -s 640x480 \
-pix_fmt yuv420p movie.mp4

หรือคุณอาจจะใช้ตัวกรองรูปแบบ ตัวอย่างนี้จะใช้ตัวกรองมาตราส่วนแทน-sและตัวกรองรูปแบบแทน-pix_fmt:

ffmpeg -pattern_type glob -i '*.JPG' -vcodec libx264 \
-vf scale=640:-2,format=yuv420p movie.mp4

นอกจากนี้ยังมีเนื้อหาเกี่ยวกับอย่างเป็นทางการในวิกิพีเดีย FFmpegภายใต้หัวข้อ“การเข้ารหัสสำหรับผู้เล่นใบ้”; เหมืองเน้น:

คุณอาจต้องใช้-pix_fmt yuv420pสำหรับการแสดงผลของคุณเพื่อทำงานใน QuickTime และผู้เล่นอื่น ๆ ผู้เล่นเหล่านี้รองรับการใช้พื้นที่สีระนาบ YUV โดยมีการสุ่มสีแบบ 4: 2: 0 สำหรับวิดีโอ H.264 มิฉะนั้นขึ้นอยู่กับแหล่งที่มาของคุณ ffmpeg อาจส่งออกไปยังรูปแบบพิกเซลที่อาจเข้ากันไม่ได้กับเครื่องเล่นเหล่านี้


6
แท้จริงแล้ว ffmpeg กำลังเลือกการเข้ารหัสเริ่มต้นของ yuv422p ซึ่งทำให้ Quicktime ไม่พอใจ การเพิ่ม-pix_fmt yuv420pแก้ไขให้ฉัน!
Nick Desaulniers

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