Tại sao Quicktime không thể phát tệp phim được mã hóa bởi FFmpeg? [bản sao]


34

Khi tôi cố gắng mở một bộ phim tôi vừa tạo bằng lệnh:

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

Tôi gặp lỗi từ 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.

Tôi đã sử dụng lệnh tương tự trên một tập hợp các hình ảnh được tạo từ một khoảng thời gian iSight, nhưng trong trường hợp này, các hình ảnh trên là từ một máy ảnh kỹ thuật số. Độ phân giải cao hơn rất nhiều, nhưng tôi đang tăng tỷ lệ lên 640x480 và tôi không thấy bất cứ điều gì trong đầu ra có vấn đề:

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

so với bộ phim làm việc:

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

Và cho đầu ra:

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)

so với người làm việc:

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)

Ngoài phim làm việc dài hơn và độ phân giải nguồn thấp hơn, điểm khác biệt duy nhất tôi có thể thấy là có thêm "[SAR 1: 1 DAR 4: 3]" được đề cập trong luồng video, nhưng tôi không biết điều này là gì là, hoặc làm thế nào để cố gắng ép buộc nó trong bộ phim không hoạt động.

Cập nhật: Tôi vừa tải xuống VLC và nó phát phim rất hay. Vì vậy, tôi biết ffmpeg không có lỗi ở đây.


2
Trong tương lai, khi hỏi về ffmpeg, vui lòng luôn bao gồm đầu ra dòng lệnh đầy đủ, không bị cắt. Nó sẽ cho bạn biết điều gì đó về định dạng pixel không tương thích với một số người chơi, nếu tôi không nhầm (và nếu bạn có phiên bản gần đây).
slhck

ffprobe video.mp4có thể được sử dụng để kiểm tra định dạng pixel nào được sử dụng.
l --marc l

Câu trả lời:


47

Dựa trên câu trả lời StackOverflow này, tôi sẽ thêm -pix_fmt yuv420pvào lệnh của bạn như thế này; một trong những ý kiến ​​đề cập thêm -vcodec libx264cũng vì vậy nó được bao gồm ở đây:

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

Hoặc bạn có thể sử dụng bộ lọc định dạng . Ví dụ này sẽ sử dụng bộ lọc tỷ lệ thay vì -svà bộ lọc định dạng thay vì -pix_fmt:

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

Cũng được xây dựng trên Wiki FFmpeg chính thức dưới tiêu đề Mã hóa dành cho người chơi câm nhấn mạnh của tôi:

Bạn có thể cần phải sử dụng -pix_fmt yuv420pcho đầu ra của mình để hoạt động trong QuickTime và hầu hết các trình phát khác. Những người chơi này chỉ hỗ trợ không gian màu phẳng YUV với mẫu phụ sắc độ 4: 2: 0 cho video H.264. Mặt khác, tùy thuộc vào nguồn của bạn, ffmpeg có thể xuất ra định dạng pixel có thể không tương thích với các trình phát này.


6
Thật vậy, ffmpeg đã chọn mã hóa mặc định của yuv422p, điều này làm đảo lộn Quicktime. Thêm -pix_fmt yuv420pgiải quyết nó cho tôi!
Nick Desaulniers

chỉ có giải pháp đầu tiên làm việc cho tôi
PR
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.