Estou recodificando a transmissão ao vivo; muitos deles ajustarão a resolução por causa do PK.
Por exemplo, a resolução é 720x1280 quando solo; após iniciar o PK, a resolução se torna 900x720; após terminar o PK e voltar ao solo, a resolução se torna 720x1280 novamente.
Esses arquivos de vídeo gravados são muito grandes e são todos h264, então estou tentando recodificá-los para AV1 para reduzir o tamanho do arquivo.
Mas após a recodificação, a resolução será fixa e não será ajustada corretamente como antes.
Aqui está a imagem, não tenho reputação suficiente para postar imagens. https://isstatic.askoverflow.dev/LhLAXMjd.gif
Por exemplo, o arquivo original está no lado esquerdo, e o arquivo recodificado está no lado direito.
Este vídeo começa em 900x720, PK termina e volta ao solo em 00:00:06, a resolução muda para 720x1280.
O ffplay reproduz o arquivo de vídeo original, tudo parece bom.
O ffplay reproduz o arquivo de vídeo recodificado, após 00:00:06, a resolução ainda mantém 900x720 e faz com que os gráficos sejam esticados e cortados.
Aqui está o comando que usei:
ffmpeg -i original.flv -y -c:v libsvtav1 re-encode.mp4
Tentei recodificar usando o mesmo codec, h264, mas o mesmo problema continua
ffmpeg -i original.flv -y -c:v libx264 re-encode.mp4
Não tenho ideia de como consertar isso
Aqui está o arquivo de vídeo: https://www.mediafire.com/file/0vaxtzurwhom8bn/ReEncode_Resolution.zip/file
Espero que o arquivo de vídeo recodificado possa ser reproduzido corretamente no ffplay (alteração de resolução quando necessário)
O problema é que o FFmpeg lê a resolução do primeiro quadro e dimensiona (redimensiona) o vídeo restante para a resolução do primeiro quadro.
Podemos resolver isso dimensionando e preenchendo todo o vídeo para uma resolução de (digamos) 900x720:
if(lt(iw/ih,900/720),-2,900)
- define a largura900
se o quadro for muito largo (caso contrário, define-2
para manter o aspecto).if(lt(iw/ih,900/720),720,-2)
- define a altura720
se o quadro estiver muito alto (caso contrário, define-2
para manter o aspecto).pad=900:720:(ow-iw)/2:(oh-ih)/2
- Adicione margens pretas (se necessário) para fixar a resolução em 900x720.Nota:
-2
aplica proporção automática, mas uniforme .Editar:
Recodificando um arquivo com múltiplas resoluções:
Recodificar um único arquivo com múltiplas resoluções em uma "passagem única" usando FFmpeg não é suportado (até onde eu sei).
Podemos dividir o arquivo em múltiplos arquivos (segmentos), recodificar cada segmento e concatenar os segmentos codificados.
Automatizar o processo requer um script (que não está incluído).
A solução a seguir mostra os estágios ("manualmente") com o vídeo de entrada de amostra :
Divida o vídeo em segmentos - cada segmento contém um único GOP (começando com um quadro-chave, sem nenhum quadro-chave no meio).
Usando o Segment Muxer com
-segment_time 0
Suppose para fazer isso:Codifique cada segmento com o codificador AV1:
Edite o gerado
list.txt
- substitua.flv
por.mp4
para todos os arquivos:Concatene os arquivos de segmentos MP4 usando o Concat Demuxer :
Certificando-se de que
output.mp4
contém várias resoluções (usando FFprobe):A saída é: