image + audio = mp4: como diminuir o vídeo?

12

Estou usando o ffmpeg para adicionar um JPG a um MP4 para criar um MP4.

Como existe apenas uma imagem para fazer o vídeo, estou me perguntando se existe uma maneira de reduzir o tamanho do vídeo.

Comando:

$ ffmpeg -loop 1 -i image.jpg -i audio.mp3 -shortest -c:a copy output.mp4

Resultados:

  • image.jpg = 26,7K (imagem não tão clara)
  • audio.mp3 = 64,6M (54 minutos)
  • output.mp4 = 80,6 milhões (o resultado do vídeo não é tão claro, a música ainda é boa)

É um tamanho razoável para MP4?

SIDU
fonte
Você poderia postar o comando ffmpeg que você usa?
ridgy
Por favor, não faça imagens de (alguns dos) textos, copie e cole. As imagens são grandes, não podem ser pesquisadas e não podem ser copiadas.
Llogan
oops sim senhor. eu fechei a janela do cmd, então não posso colar o texto agora: |
SIDU
Gostaria de saber se é possível mp4 meta para que ele toca mp3 e só manter a tela fixa em um jpg para salvar tamanho :)
Sidu
Qual é o player, dispositivo ou site de destino da saída?
Llogan

Respostas:

18

Para enviar para o YouTube

H.264: arquivos menores

Este método usa libx264 para codificar vídeo H.264. É mais lento que o método de cópia de fluxo abaixo, mas potencialmente produzirá um tamanho de arquivo menor.

ffmpeg -loop 1 -framerate 1 -i image.jpg -i music.mp3 \
-c:v libx264 -preset veryslow -crf 0 -c:a copy -shortest output.mkv

Cópia de fluxo: processo mais rápido

Este método apenas transmite cópias (sem codificação) da imagem para o contêiner MKV. É super rápido, mas se o tamanho for importante, o método acima poderá gerar um arquivo menor.

ffmpeg -loop 1 -framerate 1 -i image.jpg -i music.mp3 -c copy -shortest output.mkv
  • O YouTube aceita praticamente qualquer coisa, portanto esses comandos usam alguns truques para tornar a codificação mais rápida ou para diminuir o tamanho do arquivo e manter a qualidade alta, pois o YouTube recodificará o que você especificar. Seu player provavelmente não vai gostar, mas o YouTube gostará.

  • Nestes exemplos, é usada uma taxa de quadros muito baixa, que deve processar mais rapidamente do que o padrão de 25 fps.


Maior compatibilidade para qualquer jogador

ffmpeg -loop 1 -i image.png -i music.mp3 -vf "scale='min(1280,iw)':-2,format=yuv420p" \
-c:v libx264 -preset medium -profile:v main -c:a aac -shortest -movflags +faststart output.mp4
  • Isso deve funcionar em praticamente qualquer coisa, exceto em dispositivos muito antigos (mude -profile:v mainpara -profile:v baselinese for esse o caso).

  • Se sua entrada de áudio já é AAC, altere -c:a aacpara -c:a copypara evitar recodificação desnecessária.

  • O tempo de codificação será maior e o tamanho do arquivo será maior que os comandos do YouTube acima.

  • Veja FFmpeg Wiki: H.264 para mais informações.

llogan
fonte
Você poderia fornecer uma linha de código para criar a.jpg + a.mp3 = a.mp4 em 1280 * 720 com os quadros / segundo mais baixos permitidos pelo youtube? Além disso, como há apenas um trabalho, preciso excluir "-loop 1"? Desde já, obrigado.
Sidu
@SIDU O comando existente faz o que você solicita (exceto a saída de MKV em vez de MP4), mas não sei a menor taxa de quadros suportada pelo YouTube. Você apenas terá que experimentar. Por que você precisa de MP4 quando está apenas enviando para o YouTube?
Llogan
Eu tentei, mas ele diz:Unrecognized option 'preset'. Error splitting the argument list: Option not found
NineCattoRules
@NineCattoRules Difícil dizer sem mais informações. Use um site pastebin para mostrar seu ffmpegcomando completo e a saída completa do console a partir do comando e forneça o link em um comentário.
Llogan 3/03
Obrigado, reinstalei o FFMPEG usando o repositório mc3man e agora funciona bem!
NineCattoRules 3/03
3

Com apenas as informações que você forneceu, é o que consigo pensar.

Vamos por pedaços:

Como há apenas uma imagem adicionada ao vídeo. Gostaria de saber se existe uma maneira de reduzir o tamanho do vídeo, por exemplo, forçar taxa de bits / segundo = 1 em vez de 28?

Como é uma imagem estática, não é necessário mudar. apenas fique parado.

O que você está falando aí é de quadros por segundo (fps), não bitrate. E você está certo no conceito. Atribuir apenas uma imagem estática a 1 qps não seria um problema.

É um tamanho razoável para mp4? O tamanho da imagem importa muito?

Nesse caso, o tamanho da imagem não teria um peso significativo, porque estamos lidando com apenas uma imagem estática. Se fosse um vídeo de alta qualidade, é uma questão diferente.

Devo redimensionar o jpg para 1080 * 720 e fazer configurações adicionais no ffmpeg para que sejam exibidas como 720p (qual é a configuração do ffmpeg então :)?

A resolução que você está dizendo é 1280x720.

Eu não vejo o ponto na -loop 1opção aqui, isso apenas atrasará o processo. Você usou -shortestporque o arquivo tem mais de 1 fluxo de entrada? Se não, não há razão para usá-lo. Desde que você usou, -acodec copydevo assumir que você não deseja recodificá-lo.

Para uma saída de 720p 1fps sem recodificação e sem tocar na taxa de bits:

ffmpeg -framerate 1 -i input.mp3 -i cover.jpg -c:a copy -s 1280x720 output.mp4

Atribua ao caso que ele possui mais de um fluxo de entrada e você deseja que o ffmpeg conclua a codificação no fluxo mais curto:

ffmpeg -framerate 1 -i input.mp3 -i cover.jpg -c:a copy -s 1280x720 -shortest output.mp4

Agora, se você precisar alterar a taxa de bits (digamos 1024k como exemplo);

ffmpeg -framerate 1 -i input.mp3 -i cover.jpg -c:a copy -b:v 1024k -bufsize 1024k -s 1280x720 output.mp4

Consulte: Limitar a taxa de bits de saída

-c: a copy = Copia o fluxo de áudio de entrada para não recodificarmos.

-b: v = A taxa de bits especificada para ser (não precisamente) constante.

-bufsize = É o intervalo no qual calcula a taxa de bits média. Significa a imagem com menor qualidade e menor perda, com taxas de bits mais precisas de acordo com o especificado em -b: v .

-s = O tamanho real da saída de vídeo.

-framerate = A taxa de quadros de entrada que queremos que a saída use.

Observe que se você ainda deseja um vídeo de tamanho menor em um momento, precisará sacrificar a qualidade para conseguir isso. E outras maneiras de fazer isso envolvem a recodificação com compactação com perdas.

Pelo que você diz, pelas informações que você fornece e pelo que está tentando fazer, acho que seu objetivo é incorporar a arte do álbum ao mp3. Se esse for o seu objetivo, isso atenderá melhor aos seus requisitos:

ffmpeg -i input.mp3 -i cover.jpg -map_metadata 0 -map 0 -map 1 output.mp3

-map_metadata = O especificador de metadados ffmpeg para o arquivo de saída do infile. Nesse caso ( zero ), os metadados globais.

-map 0 = Fluxo de entrada 1 (áudio).

-map 1 = Fluxo de entrada 2 (imagem).

Se nada aqui atender aos seus pedidos, forneça mais informações.

Fenrir
fonte
Considere usar -frameratecomo uma opção de entrada e remover a saída -r: caso contrário, a taxa de quadros de entrada padrão de 25 será usada e, em seguida ffmpeg, eliminará os quadros a serem atingidos -r 1. Se você apenas declarar a taxa de quadros de entrada, a saída usará a mesma taxa de quadros.
Llogan
Obrigado. Não sabia disso. Editado para refletir as alterações sugeridas.
Fenrir
Obrigado pelo tutorial. Minha linha de código origianl ffmpeg era um copiar e colar da pesquisa no Google, que não tenho idéia do que é o quê.
Sidu