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.