Perché Quicktime non può riprodurre un filmato codificato da FFmpeg? [duplicare]


34

Quando provo ad aprire un film che ho appena creato con il comando:

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

Ricevo un errore da 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.

Ho usato lo stesso comando su una serie di immagini generate da un time-lapse di iSight, ma in questo caso le immagini di cui sopra provengono da una fotocamera digitale. La risoluzione è molto più alta, ma la sto ridimensionando a 640x480 e non vedo nulla nell'output che suggerisca un problema:

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. il film di lavoro:

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

E per l'output:

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. per quello funzionante:

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)

A parte il fatto che il film di lavoro è più lungo e una risoluzione della sorgente inferiore, l'unica differenza che posso vedere è che c'è un ulteriore "[SAR 1: 1 DAR 4: 3]" menzionato nel flusso video, ma non ho idea di cosa sia è, o come provare a forzarlo nel film non funzionante.

Aggiornamento: ho appena scaricato VLC e riproduce bene il film. Quindi so che ffmpeg non è in colpa qui.


2
Per il futuro, quando chiedi di ffmpeg, includi sempre l'output della riga di comando completo e non tagliato. Avrebbe dovuto dirti qualcosa sul formato pixel non compatibile con alcuni lettori, se non sbaglio (e se hai una versione recente).
slhck,

ffprobe video.mp4può essere utilizzato per verificare quale formato di pixel viene utilizzato.
l

Risposte:


47

Sulla base di questa risposta StackOverflow aggiungerei -pix_fmt yuv420pal tuo comando in questo modo; uno dei commenti menziona anche l' aggiunta -vcodec libx264, quindi è incluso qui:

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

Oppure potresti usare il filtro di formato . In questo esempio verrà utilizzato il filtro di ridimensionamento anziché -se il filtro di formattazione anziché -pix_fmt:

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

Inoltre elaborato nel Wiki ufficiale di FFmpeg sotto la voce "Codifica per giocatori stupidi"; enfasi mia:

Potrebbe essere necessario utilizzare -pix_fmt yuv420paffinché l'output funzioni in QuickTime e nella maggior parte degli altri lettori. Questi lettori supportano solo lo spazio colore planare YUV con il sottocampionamento chroma 4: 2: 0 per i video H.264. Altrimenti, a seconda della fonte, ffmpeg potrebbe essere riprodotto in un formato pixel che potrebbe essere incompatibile con questi lettori.


6
In effetti, ffmpeg stava scegliendo la codifica predefinita di yuv422p che sconvolse Quicktime. Aggiunta -pix_fmt yuv420prisolto per me!
Nick Desaulniers,

solo la prima soluzione ha funzionato per me
PR
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.