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.


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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.