Por que o Quicktime não pode reproduzir um arquivo de filme codificado pelo FFmpeg? [duplicado]

34

Quando tento abrir um filme que acabei de criar com o comando:

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

Eu recebo um erro do 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.

Eu usei o mesmo comando em um conjunto de imagens geradas a partir de um lapso de tempo do iSight, mas, neste caso, as imagens acima são de uma câmera digital. A resolução é muito mais alta, mas estou escalando para 640x480 e não vejo nada na saída que sugira um 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. o filme de trabalho:

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 para a saída:

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. para o trabalho:

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)

Além de o filme ser mais longo e com uma resolução de fonte mais baixa, a única diferença que vejo é que há um "[SAR 1: 1 DAR 4: 3]" extra mencionado no fluxo de vídeo, mas não tenho idéia do que isso é, ou como tentar forçá-lo no filme que não funciona.

Atualização: Acabei de baixar o VLC e ele reproduz bem o filme. Então eu sei que o ffmpeg não tem culpa aqui.

Michael
fonte
2
Para o futuro, ao perguntar sobre o ffmpeg, sempre inclua a saída da linha de comando completa e sem cortes. Deveria ter dito algo sobre o formato de pixel não ser compatível com alguns players, se não me engano (e se você tem uma versão recente).
Slhck
ffprobe video.mp4pode ser usado para verificar qual formato de pixel é usado.
l --marc l

Respostas:

47

Com base nesta resposta StackOverflow, eu adicionaria -pix_fmt yuv420pao seu comando assim; um dos comentários menciona a adição -vcodec libx264, então está incluído aqui:

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

Ou você pode usar o filtro de formato . Este exemplo usará o filtro de escala em vez de -se o filtro de formato em vez de -pix_fmt:

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

Também elaborado no Wiki oficial do FFmpeg, sob o título "Codificação para jogadores burros"; ênfase minha:

Pode ser necessário usar -pix_fmt yuv420psua saída para funcionar no QuickTime e na maioria dos outros players. Esses players suportam apenas o espaço de cores planas YUV com subamostragem de croma 4: 2: 0 para vídeo H.264. Caso contrário, dependendo da sua fonte, o ffmpeg poderá gerar um formato de pixel incompatível com esses players.

JakeGould
fonte
6
De fato, o ffmpeg estava escolhendo a codificação padrão do yuv422p, o que perturbou o Quicktime. Adicionando -pix_fmt yuv420presolveu para mim!
precisa
apenas a primeira solução funcionou para mim
PR