Mengapa Quicktime tidak dapat memutar file film yang disandikan oleh FFmpeg? [duplikat]

34

Ketika saya mencoba membuka film, saya baru saja membuat dengan perintah:

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

Saya mendapatkan kesalahan dari 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.

Saya menggunakan perintah yang sama pada serangkaian gambar yang dihasilkan dari selang waktu iSight, tetapi dalam kasus ini gambar di atas berasal dari kamera digital. Resolusi ini jauh lebih tinggi, tetapi saya mengubah ke 640x480 dan saya tidak melihat apa pun di output yang menunjukkan masalah:

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

vs. film yang bekerja:

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

Dan untuk hasilnya:

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)

vs. untuk yang bekerja:

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)

Selain dari film yang bekerja lebih lama dan resolusi sumber yang lebih rendah, satu-satunya perbedaan yang dapat saya lihat adalah bahwa ada tambahan "[SAR 1: 1 DAR 4: 3]" yang disebutkan dalam aliran video, tetapi saya tidak tahu apa ini adalah, atau bagaimana mencoba memaksanya dalam film yang tidak berfungsi.

Pembaruan: Saya baru saja mengunduh VLC dan memutar film dengan baik. Jadi saya tahu ffmpeg tidak bersalah di sini.

Michael
sumber
2
Untuk masa depan, ketika bertanya tentang ffmpeg, harap selalu sertakan keluaran baris perintah yang lengkap dan tidak dipotong. Seharusnya memberi tahu Anda sesuatu tentang format piksel tidak kompatibel dengan beberapa pemain, jika saya tidak salah (dan jika Anda memiliki versi terbaru).
slhck
ffprobe video.mp4dapat digunakan untuk memeriksa format piksel mana yang digunakan.
l --marc l

Jawaban:

47

Berdasarkan jawaban StackOverflow ini saya akan menambahkan -pix_fmt yuv420pperintah Anda seperti ini; salah satu komentar menyebutkan menambahkan -vcodec libx264jadi itu termasuk di sini:

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

Atau Anda bisa menggunakan format filter . Contoh ini akan menggunakan filter skala sebagai ganti -s, dan format filter bukan -pix_fmt:

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

Juga diuraikan dalam FFmpeg Wiki resmi di bawah judul "Pengkodean untuk pemain bodoh"; penekanan milikku:

Anda mungkin perlu menggunakan -pix_fmt yuv420pagar output Anda berfungsi di QuickTime dan sebagian besar pemain lain. Para pemain ini hanya mendukung ruang warna planar YUV dengan subsampel chroma 4: 2: 0 untuk video H.264. Jika tidak, tergantung pada sumber Anda, ffmpeg dapat menampilkan ke format piksel yang mungkin tidak kompatibel dengan pemain ini.

JakeGould
sumber
6
Memang, ffmpeg memilih pengkodean default dari yuv422p yang mengecewakan Quicktime. Menambahkan -pix_fmt yuv420pdipecahkan untuk saya!
Nick Desaulniers
hanya solusi pertama yang bekerja untuk saya
PR