FFMPEG converte flv para mp4 sem perder qualidade [duplicado]

55

Esta pergunta já tem uma resposta aqui:

Atualmente, estou convertendo arquivos flash .flv para arquivos .webm e .mp4 para serem usados ​​com um player de vídeo HTML5.

_

Eu uso esse comando ffmpeg para WEBM: ffmpeg -i filename.flv -vcodec libvpx -acodec libvorbis filename.webm que funciona muito bem e o tamanho do arquivo permanece relativamente o mesmo (imporatante).

_

Para MP4, estou usando o seguinte: ffmpeg -i filename.flv -sameq -ar 22050 filename.mp4

Ele se converte em .mp4 e evita qualquer perda de qualidade, mas o tamanho do arquivo quase triplica.

Que fórmula ffmpeg poderia ser usada para converter para MP4 sem perder muita qualidade e impedir um tamanho de arquivo muito maior?

Chad Whitaker
fonte

Respostas:

57
ffmpeg -i filename.flv -c:v libx264 -crf 19 -strict experimental filename.mp4

Você deve especificar o codec de vídeo usado. No seu comando, você não especifica -vcodecou, -c:vportanto, o ffmpeg usa o codec padrão para MP4 ( mpeg4), que não possui uma eficiência de compactação muito boa. Tente usar a libx264 e definir o CRF, que é o nível de qualidade (quanto menor, melhor, o padrão é 23 e os valores sãos estão entre 18 e 28).

A codificação com libx264 é um pouco complexa, portanto, você deve procurar o guia de codificação H.264 .

Você também precisa especificar o -strict experimentalcontrário: "O codificador 'aac' é experimental, mas os codecs experimentais não estão ativados; adicione '-strict -2' se desejar usá-lo."

sashoalm
fonte
11
Isso leva muito tempo e o mp4 resultante é muito distorcido, os pixels perdidos, etc. Alguma idéia do porquê disso? : /
trainoasis
O codec de vídeo padrão para o formato mp4 não é necessariamente mpeg4. De acordo com a saída da ffmpeg --help muxer=mp4minha máquina, o ffmpeg usa o h264 como codec de vídeo padrão do mp4.
doubleDown 12/12
11
@doubleDown Minha resposta é antiga - desde 2011. Eles provavelmente mudaram os padrões em algum momento desde então.
Sashoalm
43

Este comando altera apenas o contêiner sem recodificar

ffmpeg -i input.flv -codec copy output.mp4
c97
fonte
você conheceria uma maneira de criar um script para a conversão em lote de muitos vídeos na mesma pasta?
ttoine
sim, em janelas criar CONVERT.BAT arquivo e colocar esse código nele: for %%a in ("*.flv") do ffmpeg -i "%%a" -codec copy "%%~na.mp4", em seguida, executar CONVERT.BAT na pasta com arquivos * .flv
C97
11
Para mim, isso lança Não foi possível gravar o cabeçalho do arquivo de saída # 0 (parâmetros de codec incorretos?): Argumento inválido. Alguma ideia? : /
trainoasis
2
@trainoasis seu .flv não contém vídeo H.264 e áudio AAC. Copiar os dados de áudio / vídeo intocados -codec copypara um arquivo .mp4 só funciona em casos muito raros, onde o áudio e o vídeo estão codificados com H.264 e AAC. Consulte superuser.com/a/1009539/390946 e addpipe.com/blog/flv-to-mp4 .
Octavian Naicu
3

avconve ffmpegsão essencialmente a mesma coisa. [recentemente, há ALGUMA DIVISÃO, mas não há muito o que escrever, se você compilar o seu próprio ffmpeg[o fornecido nos repositórios do Ubuntu, por exemplo, é VELHO e sofre com esse tamanho de vídeo não é um acordo blá blá blá [basicamente tenta para dizer a você que o vídeo tem proporções erradas], mas se você se incomodar em ler o ffmpegguia de compilação e compilá-lo no git, ele não terá nenhum dos problemas das versões mais antigas que aparecem na maioria dos sistemas operacionais. o aviso de depreciação a que se refere avconvestá dizendo que eles criaram um utilitário mais novo para tentar substituir ffmpeg, mas é tão amplamente usado que, mesmo que tentassem cortá-lo, todos estaríamos criando links avconvparaffmpeg de qualquer maneira, para que eles não parem de trabalhar e o abandonem.]]

Não é uma coisa ruim de usar avconv. Acabei de ver a resposta mencionando o aviso de depreciação, que é essencialmente uma mensagem vazia, deveria ser mais uma alternativa ao ffpmeg, você pode tentar o avconv, que é mais verdadeiro no caso aqui.

avconv -i inputfile.flv -map 0 -c:v libx264 -c:a copy outputfile.mp4

é realmente o mesmo que

ffmpeg -i filename.flv -vcodec libvpx -acodec libvorbis

essencialmente no primeiro você está usando as opções de mãos mais curtas e no segundo é a variedade mais escrita.

TAMBÉM -map 0está se referindo às faixas de áudio; portanto, se estiver usando algo parecido com o mp4aque pode lidar com várias faixas de áudio, você pode deixar isso para copiar todos os fluxos de áudio no arquivo resultante. Isso é necessário apenas se você usar um codec que não suporta várias faixas de áudio no mesmo arquivo, então você deseja mapear o áudio necessário e não todos. É claro que se você tentar minimizar o espaço usado, poderá especificar apenas um para tentar extrair um pouco do tamanho do arquivo [o áudio é talvez um 1/3 do tamanho da faixa de vídeo [e isso é generoso]].

-c:v = codec(video)so: -c:v libx264é o mesmo que usar: -vcodec libx264FYI; mesmo com este exemplo:-c:v copy = -vcodec copy

além disso, para os FLVs, tenha cuidado, o arquivo flv é o mesmo que um avi, pois é um contêiner que pode conter qualquer número de codecs para vídeo ou áudio. Você deseja primeiro usar o utilitário de inspeção de mídia de sua escolha para ver o que é usado no próprio arquivo antes de optar por copiar o fluxo de vídeo e / ou áudio ou se você deseja transmiti-lo do que quer que seja para algo novo. Portanto, o comando que funciona melhor para um FLV pode não ser o mesmo para outro FLV [é claro que, geralmente, se você receber vários FLVs da mesma fonte, eles serão codificados da mesma maneira, mas isso nunca é uma garantia].

O fato de não tentar escolher nada funcionou na pesquisa na web e queria ajudar a esclarecer um pouco as coisas para as pessoas.

Novamente, como esta resposta indica a resposta abaixo, essa mensagem SIM, executando o ffmpeg, sempre postará essa mensagem, é essencialmente oca, pois esses dois utilitários ainda são realmente o mesmo utilitário com pouca diferença. Em quase todos os casos, você deve obter exatamente os mesmos resultados usando qualquer um dos comandos. Isso não necessariamente resultará em uma re-transcodificação completa, por quê? A, se não for necessário, poupa muito tempo e B, se você transcodificar um arquivo que já foi compactado em um codec de vídeo, está executando essencialmente uma rotina de compactação contra algo que já está compactado e sempre resultará em menos qualidade que a fonte. A maioria dos codecs mais novos são compatíveis entre si [nem todos], como por exemplo, um flv poderia tecnicamente ser um MP4 dentro de um wrapper FLV, já que FLVs como AVIs são apenas recipientes de outros codecs. Assim, depende do que a fonte flv possui para o codec de vídeo e ausio comparado com o que você está convertendo para saber se precisa ser transcodificado. Se, no FLV, eles usassem o vídeo H264 MP4 e o MP4a para áudio, você não precisaria recodificar novamente o que seria necessário copiá-lo e ajustar os cabeçalhos dos arquivos para que sejam lidos como um verdadeiro MP4 em vez de um vídeo MP4 dentro de um arquivo FLV.

Pária
fonte
3

De acordo com este guia , o comando adequado para converter FLV para MP4 sem qualquer recodificação AV é o seguinte:

ffmpeg -i input.flv -c copy -copyts output.mp4

Funcionou perfeitamente para mim em todos os casos com vídeo AVC e áudio AAC ou MP3.

Al Kepp
fonte
-1

Ao usar o ffmpeg, recebi um aviso de reprovação para usar o avconv. Usando o avconv, obtive bons resultados:

avconv -i inputfile.flv -map 0 -c: v libx264 -c: uma cópia outputfile.mp4

Leia man avconvpara mais informações.

gare_c
fonte
11
ffmpegem si não é preterido . A razão pela qual parece bom é porque você especifica o codificador x264 que possui boas configurações padrão de qualidade.
Slhck 01/03
-2

Sugiro que você crie um script de shell para o chamado video_flv_to_mp4com o seguinte conteúdo:

ffmpeg -i $1 -sameq -ar 22050 -vcodec libx264 $1.mp4 

Em seguida, execute-o assim:

$ video_flv_to_mp4 video.flv

Ele fornecerá um arquivo video.flv.mp4.

Thibault
fonte
4
-sameqnão é mais uma opção válida para o ffmpeg. Também não significa "mesma qualidade". Veja também este post .
slhck