Sou um novato completo em edição de vídeo, então me perdoe se eu pedir algo ridículo.
Estou recebendo clipes de vídeo de uma caixa de gravador descodificadora. Os clipes são arquivos AVI:
Resolution: 1920 x 1080 Frames Per Second: 60 Video Format: ITU H.264 Audio Format: MPEG 1 Audio, Layer 3 (MP3)
A resolução e o FPS estão bem além do que eu exijo, então estou tentando executar um comando para reduzir as coisas:
ffmpeg -i highres.avi -r 30 -s 960x540 lowerres.avi
Isso me deu a resolução desejada, taxa de quadros e tamanho de arquivo menor, mas também degradou a qualidade muito mais do que eu esperava.
Eu olhei para o novo arquivo e descobri que por algum motivo o FFmpeg converteu o formato usado:
Video Format: FFmpeg MPEG-4 Audio Format: MPEG 1 Audio, Layer 2
Não está claro para mim por que isso não usaria os mesmos formatos de saída dos formatos de entrada. Tentei usar este comando para forçá-lo a usar H.264:
ffmpeg -i highres.avi -r 30 -s 960x540 -f h264 lowerresforceh264.avi
Infelizmente, falhou com a seguinte saída:
ffmpeg version 0.7.3-4:0.7.3-0ubuntu0.11.10.1, Copyright (c) 2000-2011 the Libav developers built on Jan 4 2012 16:21:50 with gcc 4.6.1 configuration: --extra-version="4:0.7.3-0ubuntu0.11.10.1" --arch=i386 --prefix=/usr --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --enable-libvpx --enable-runtime-cpudetect --enable-vaapi --enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdc1394 --enable-shared --disable-static WARNING: library configuration mismatch avutil configuration: --extra-version="4:0.7.3ubuntu0.11.10.1" --arch=i386 --prefix=/usr --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --enable-libvpx --enable-runtime-cpudetect --enable-vaapi --enable-libopenjpeg --enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdirac --enable-libmp3lame --enable-librtmp --enable-libx264 --enable-libxvid --enable-libvo-aacenc --enable-version3 --enable-libvo-amrwbenc --enable-version3 --enable-libdc1394 --shlibdir=/usr/lib/i686/cmov --cpu=i686 --enable-shared --disable-static --disable-ffmpeg --disable-ffplay avcodec configuration: --extra-version="4:0.7.3ubuntu0.11.10.1" --arch=i386 --prefix=/usr --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --enable-libvpx --enable-runtime-cpudetect --enable-vaapi --enable-libopenjpeg --enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdirac --enable-libmp3lame --enable-librtmp --enable-libx264 --enable-libxvid --enable-libvo-aacenc --enable-version3 --enable-libvo-amrwbenc --enable-version3 --enable-libdc1394 --shlibdir=/usr/lib/i686/cmov --cpu=i686 --enable-shared --disable-static --disable-ffmpeg --disable-ffplay avformat configuration: --extra-version="4:0.7.3-0ubuntu0.11.10.1" --arch=i386 --prefix=/usr --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --enable-libvpx --enable-runtime-cpudetect --enable-vaapi --enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdc1394 --shlibdir=/usr/lib/i686/cmov --cpu=i686 --enable-shared --disable-static --disable-ffmpeg --disable-ffplay avdevice configuration: --extra-version="4:0.7.3-0ubuntu0.11.10.1" --arch=i386 --prefix=/usr --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --enable-libvpx --enable-runtime-cpudetect --enable-vaapi --enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdc1394 --shlibdir=/usr/lib/i686/cmov --cpu=i686 --enable-shared --disable-static --disable-ffmpeg --disable-ffplay avfilter configuration: --extra-version="4:0.7.3-0ubuntu0.11.10.1" --arch=i386 --prefix=/usr --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --enable-libvpx --enable-runtime-cpudetect --enable-vaapi --enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdc1394 --shlibdir=/usr/lib/i686/cmov --cpu=i686 --enable-shared --disable-static --disable-ffmpeg --disable-ffplay swscale configuration: --extra-version="4:0.7.3-0ubuntu0.11.10.1" --arch=i386 --prefix=/usr --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --enable-libvpx --enable-runtime-cpudetect --enable-vaapi --enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdc1394 --shlibdir=/usr/lib/i686/cmov --cpu=i686 --enable-shared --disable-static --disable-ffmpeg --disable-ffplay postproc configuration: --extra-version="4:0.7.3-0ubuntu0.11.10.1" --arch=i386 --prefix=/usr --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --enable-libvpx --enable-runtime-cpudetect --enable-vaapi --enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdc1394 --shlibdir=/usr/lib/i686/cmov --cpu=i686 --enable-shared --disable-static --disable-ffmpeg --disable-ffplay libavutil 51. 7. 0 / 51. 7. 0 libavcodec 53. 6. 0 / 53. 6. 0 libavformat 53. 3. 0 / 53. 3. 0 libavdevice 53. 0. 0 / 53. 0. 0 libavfilter 2. 4. 0 / 2. 4. 0 libswscale 2. 0. 0 / 2. 0. 0 libpostproc 52. 0. 0 / 52. 0. 0 Input #0, avi, from "highres.avi": Metadata: comment : Quality_GOOD encoder : Lavf52.64.2 encoded_by : AverMedia_c281_1.7.2 Duration: 00:01:59.28, start: 0.000000, bitrate: 10263 kb/s Stream #0.0: Video: h264 (High), yuv420p, 1920x1080, 59.94 fps, 59.94 tbr, 59.94 tbn, 119.88 tbc Stream #0.1: Audio: mp3, 48000 Hz, stereo, s16, 128 kb/s [buffer @ 0x8f438a0] w:1920 h:1080 pixfmt:yuv420p [scale @ 0x8f431e0] w:1920 h:1080 fmt:yuv420p -> w:960 h:540 fmt:yuv420p flags:0x4 [libx264 @ 0x8f0fb40] broken ffmpeg default settings detected [libx264 @ 0x8f0fb40] use an encoding preset (e.g. -vpre medium) [libx264 @ 0x8f0fb40] preset usage: -vpre <speed> -vpre <profile> [libx264 @ 0x8f0fb40] speed presets are listed in x264 --help [libx264 @ 0x8f0fb40] profile is optional; x264 defaults to high Output #0, h264, to "lowerresforceh264.avi": Stream #0.0: Video: libx264, yuv420p, 960x540, q=2-31, 200 kb/s, 90k tbn, 30 tbc Stream mapping: Stream #0.0 -> #0.0 Error while opening encoder for output stream #0.0 - maybe incorrect parameters such as bit_rate, rate, width or height
Não tenho certeza porque não posso fazer isso. A execução de “ffmpeg -formats” listou h264 como um que poderia usar para entrada e saída.
Se alguém pudesse me indicar a direção certa, eu agradeceria muito. Obrigado.
PS: Estou usando o FFmpeg versão 0.7.3-4: 0.7.3-0 no Ubuntu 11.10.
EDITAR
Eu estou encontrou uma solução olhando para o uso de predefinições. Depois de procurar informações sobre predefinições, encontrei o seguinte tutorial discutindo-as:
http://juliensimon.blogspot.com/2009/01/howto-ffmpeg-x264-presets.html
Eu só precisava especificar o codec e a configuração predefinida adequada, como:
ffmpeg -i highres.avi -r 30 -s 960x540 -vcodec libx264 -vpre medium lowerresforceh264vpremedium.avi
Ainda tenho alguns ajustes a fazer, mas isso é basicamente o que eu queria. Obrigado.
Comentários
- Claro, algumas pessoas simplesmente querem saber como converter arquivos Avermedia .avi .mp4 para que possam ser reproduzidos em Mountain Lion / Mavericks < pre > ffmpeg -i 140203-1229.avi -vcodec cópia -acodec cópia fromavermedia_cog.mp4 < / pre >
Resposta
I ” estou tentando ajudar. Primeiro, não entendo por que você está dizendo que FFMPEG H.264 não é o formato de entrada?
Não conheço a linha de comando FFMPEG bem o suficiente (há alguém que faz? 😉 ). Deve haver uma opção para a codificação multipass. Sei que existem alguns presets integrados que você provavelmente poderia usar e quase certamente fará o que deseja. Normalmente são chamados de predefinições x264 ou sintonia x264. Você consegue encontrar algo assim?
Comentários
- Obrigado. Sua conversa sobre predefinições me ajudou a encontrar uma solução provável. Eu ‘ edito a postagem para mostrar o que fiz.
- Ótima solução. Adicionado à minha coleção de snippets. Obrigado.
- @BigBeagle: quando encontrar uma resposta para sua pergunta, você pode postá-la como uma resposta. A edição de sua pergunta é feita para fornecer mais clareza à pergunta. Pelo que entendi, as respostas vão para a seção de respostas.
Resposta
ffmpeg removeu suas predefinições x264, portanto, A configuração -vpre não funciona mais.
Agora, eu tenho um script para converter arquivos de vídeo para um formato que meu celular pode suportar.
ffmpeg -i input.avi -sws_flags lanczos+accurate_rnd -vf "scale=320:240" -c:v libx264 -crf 20 -preset veryslow -profile:v main -tune fastdecode -c:a copy output.mkv
Explicarei cada opção
-sws_flags lanczos+accurate_rnd
esta opção é o algoritmo de redução de escala, lanczos é recomendado porque produz menos artefatos sem borrar, mas é lento.
-vf "scale=..."
é autoexplicativo especificar a resolução de saída
-crf 20
este é o qualidade, 20 é uma boa configuração de saída final (não use antes de editar), esta é a qualidade constante e é a melhor opção quando o tamanho do arquivo não é apertado e produzirá melhor qualidade no menor tamanho de arquivo do que qualquer outra coisa duas passagens para qualidade máxima em um tamanho de arquivo específico (como a necessidade de caber em um CD ou DVD), taxa de bits fixa (ex. ) só deve ser usado durante a transmissão, um caso especial é” 0 “, que é sem perdas e o intervalo desta opção é de 1 (qualidade mais alta) a 50 (qualidade mais baixa).
Um bom teste para isso é executar a codificação com -crf 20, anotar a taxa de bits e, em seguida, usar isso como a configuração -b para uma 2ª versão do arquivo, ambos devem ter o mesmo tamanho, compare os dois para diferenças de qualidade.
-preset veryslow
isso escolhe a quantidade de CPU que você deseja usar, mais lento é quanto menor o tamanho do arquivo e melhor qualidade.
-profile:v main
este é o perfil H.264 para usar. high é o tamanho de arquivo mais eficiente, mas usa muita CPU para decodificar em comparação com os outros formatos, sendo dito que é o mais popular, já que a maioria dos celulares tem um decodificador de hardware embutido e o flash player suporta, o meu não, então eu tenho que use o principal.
-tune fastdecode
meu celular não gosta de reproduzir os arquivos sem esta opção, mas geralmente pode ser deixado em branco ou definido como “filme” para videogames, o O principal motivo de você usar isso é para obter um pouco mais de qualidade.
E a última coisa que eu recomendo usar um formato de contêiner moderno .avi não é projetado para conter H.264 e pelo que entendi lá ” s nenhum padrão para armazenar H.264 ou tornar o arquivo maior que 2 GB, a maioria das implementações são hacks e propensas a ter problemas, use mkv ou mp4.
Comentários
- As predefinições para libx264 agora são especificadas por
-preset
como em-preset slow
-
-tune fastdecode
desativa o desbloqueio e os quadros B e P ponderados, bem como CABAC. Existem decodificadores que podem lidar com quadros B, mas não CABAC? Sugiro-profile:v baseline
, se você precisar direcionar decodificadores de hardware antigos. (fastdecode
pode ser útil se direcionar um software re decodificador em uma CPU lenta, mas não um decodificador de hardware.) Principal com quadros B, mas sem desbloqueio ou CABAC pode ou não parecer melhor do que a linha de base com desbloqueio. 1 para recomendar não-AVI para armazenar h.264. IIRC, o principal é quadros B, mas sim h.264 em avi não é bem padronizado e ‘ é hacky. - I ‘ d chamar
-crf 20
uma final alta. Você pode mudar para 22 ou mesmo 24 e provavelmente ficará bem, a menos que seja ‘ um movimento alto, como um evento esportivo.
Resposta
Há algumas coisas a deixar claro:
- Um formato é não um codec; você deseja obter um arquivo no formato avi com vídeo codificado com h264 codec. Basta usar -vcodec libx264 e um nome de arquivo com .avi . O Ffmpeg deve reconhecer um formato olhando para uma extensão de arquivo, mas você também pode ser específico adicionando -f avi . Definitivamente, você não deseja usar mpeg1, porque oferece pior qualidade que mpeg2 ou ainda pior em comparação com mpeg4, o que eu recomendo.
- Seu problema é que o ffmpeg acabou de usar a qualidade mais baixa possível porque você não especificou nenhuma. A opção -sameq raramente parece funcionar para mim. Na verdade, é muito difícil definir a taxa de bits manualmente. Adicione, por exemplo, -vb 3000k para obter um arquivo com taxa de bits média de vídeo de 3Mb / s, o que dá uma qualidade bastante boa. Acho que seria o suficiente para você ter 2 Mb / s para a resolução mencionada.
- A chave para reduzir o tamanho do arquivo não é a resolução, mas a taxa de bits mencionada acima. Prefiro manter a resolução original e apenas manipular a taxa de bits.
- Eu acho que você também deseja manter o áudio sem conversão (portanto, sem perda de qualidade), então use -acodec copy .
Tente isto: ffmpeg -i highres.avi -acodec cópia -vcodec libx264 -vb 2000k inferior res.avi
Comentários
- A taxa de bits constante é a pior (em termos de qualidade vs. tamanho) de todos os modos de controle de taxa em x264 e deve ser evitado. Use
-crf
para definir um modo de qualidade constante.