Relação de aspecto correta sem recodificar o arquivo de vídeo

18

Eu tenho um fluxo de vídeo com as seguintes propriedades:

Stream #0:0: Video: mpeg4 (Advanced Simple Profile) (XVID / 0x44495658), yuv420p, 720x416 [SAR 1:1 DAR 45:26], 1908 kb/s, 25 fps, 25 tbr, 25 tbn, 25 tbc

Quando o executo no VLC, tenho que pressionar "A" para alterar a proporção para "4: 3" para fazer o vídeo ser exibido com a proporção correta.

Analisando os fatos do vídeo, o erro é que: a) o vídeo real foi estendido incorretamente nos dados do pixel; ou b) há simplesmente algum valor de metadados que foi definido incorretamente?

Se for o primeiro, sei que posso recodificar o vídeo e alterar a largura e a altura. Mas, se for o último, qual comando ffmpeg devo executar para corrigir os metadados sem recodificar o vídeo em si?

fortrina
fonte

Respostas:

36

Há uma diferença entre Sample Aspect Ratio (SAR) e Display Aspect Ratio (DAR). Se você deseja alterar o vídeo a ser exibido em 4: 3, será necessário alterar os pixels reais na imagem (escalando os pixels e alterando o SAR) ou definindo um sinalizador de metadados que, no nível do contêiner, informa ao externo players de mídia para esticar a imagem para o DAR desejado.

Você não poderá dimensionar os pixels e alterar o SAR sem aplicar um filtro de vídeo. Se você escolher esse método, será necessário transcodificar o arquivo - já que não é possível "copiar em sequência" o fluxo de vídeo enquanto aplica um filtro de vídeo.

Para dimensionar a imagem e alterar o SAR (durante a transcodificação), tente:

ffmpeg -i <INPUT_FILE> -vf scale=720:540 -c:v <Video_Codec> <OUTPUT_FILE>

Por outro lado, se você quiser apenas alterar o sinalizador de metadados e ajustar o DAR, poderá copiar o vídeo em fluxo contínuo. Para fazer isso, tente:

ffmpeg -i <INPUT_FILE> -aspect 720:540 -c copy [OUTPUT_FILE]
occvtech
fonte
Excelente! Alterar o aspecto funcionou imediatamente!
forthrin
1
Você não pode usar -c copye escalar ao mesmo tempo; no entanto, você pode usar -aspectpara alterar a proporção no nível do contêiner (mas não no nível do fluxo).
Llogan
@LordNeckbeard, using -aspectfunciona para reprodução ffplay, mas não no WMP ou MPC-HC. Ele adiciona um item SAR / DAR adicional à Stream #…linha de informações, FFmpeg/probe/playmas não parece ser a solução para a reprodução geral. Esticar o vídeo com a janela parece ser a solução mais fácil para a reprodução de MPC-HC.
Lumi
não funcionou para mim para MPEG2 sem reencodar
Mikhail V
Não sei por que não funcionou para mim. Apenas produz o mesmo vídeo!
Tina J
4

A resposta de Delgado está correta de que o MP4Box pode fazer isso, mas a -paropção não funciona da maneira descrita. Com um -outparâmetro (para não perturbar seu arquivo original):

mp4box source.mp4 -out target.mp4 -par stream-number=width:height

Ao usar -par stream-number=width:height, você define a proporção de pixel - ou seja, o resultado da divisão da proporção do dispositivo pela proporção de armazenamento. (Equivalentemente, você está descrevendo a proporção de um pixel de origem.) Por exemplo, suponha que você tenha uma fonte de DVD com 720 × 480 e a proporção de exibição correta seja 4: 3. Para este caso, você precisa:

mp4box source.mp4 -out target.mp4 -par 1=8:9

porque (4/3) / (720/480) = 8/9.

Se a fonte representar pixels SD NTSC verdadeiros (nesse caso, apenas os 704 × 480 pixels centrais devem mapear para uma tela 4 × 3, com 8 pixels overscan nos dois lados), o comando correto seria:

mp4box source.mp4 -out target.mp4 -par 1=10:11

porque (4/3) / (704/480) = 10/11 - exatamente a proporção do pixel de referência para o vídeo NTSC de definição padrão.

Para o caso apresentado na pergunta, se é realmente 4: 3, isso fornece uma proporção de pixel muito estranha: (4/3) / (720/416) = 104/135. Tem 720 de largura, o que sugere uma fonte de DVD; é um vídeo de 25 qps, sugerindo PAL, mas o PAR funciona com menos de 1, sugerindo NTSC. Poderia ser 4: 5, suponho (muito próximo a 104: 135), mas não sei de nada que produza essa proporção de pixel; talvez tente primeiro e tente 3: 4 se ainda parecer um pouco esticado demais na horizontal. Se você tem certeza de que são exatamente 4: 3, é claro, basta usar 104: 135.

Coises
fonte
3

O ffmpeg não pode alterar os parâmetros de um fluxo de vídeo sem recodificar, MP4Box (parte do gpac ) e mkvmerge. No caso de um fluxo de vídeo e uma proporção real / correta de 4: 3, você pode tentar:

MP4Box -par 1=3:4 VideoFile.mp4

    "-par" : PixelAspectRatio (adjusts DAR + SAR with respect to the video resolution)
    "1"=   : stream number
    "3:4"  : aspect ratio (lower number 1st!)
    Changes are directly applied to "VideoFile.mp4", no copy

Para verificar antes e depois: ffmpeg -i VideoFile.mp4

Delgado
fonte
0

Alterar o SAR sem reencodar também trabalha com ffmpegon .mp4usando o h264_metadatacomo Gyan apontou aqui :

ffmpeg -i in.mp4 -c copy -bsf:v "h264_metadata=sample_aspect_ratio=4/3" out.mp4
drake7
fonte
Embora isso possa teoricamente responder à pergunta, seria preferível incluir aqui as partes essenciais da resposta e fornecer o link para referência.
MMM