Eu tentei descobrir isso sozinho, mas a miríade de opções me deixa perplexo.

Desejo usar de preferência ffmpeg ou mencoder (ou outra coisa, mas esses dois eu sei que estou funcionando ) para converter qualquer vídeo recebido em um tamanho de tela fixo.

Se o vídeo for mais largo ou muito curto para ele, corte o vídeo no centro. Se não tiver o tamanho certo, redimensione ou para torná-lo exatamente do tamanho de tela fixo.

A última coisa exata de que preciso é 720×480 em um XVid AVI com uma faixa de áudio MP3.

Eu encontrei muitas páginas mostrando como redimensionar para uma resolução máxima, mas preciso que o vídeo tenha exatamente essa resolução (com partes extras cortadas, sem barras pretas).

Alguém pode me dizer a linha de comando para executar – ou pelo menos obter-me um pouco / a maior parte do caminho? Se precisar de várias linhas de comando (execute X para obter a resolução, faça é o cálculo e, em seguida, execute Y com a saída desse cálculo) Posso fazer o script disso.

Comentários

  • Aparentemente, o dispositivo de vídeo também funciona com Mpeg4 como XVid AVI, se ‘ é mais fácil / melhor.

Resposta

Não sou um guru do ffmpeg, mas isso deve funcionar.

Em primeiro lugar, você pode obter o tamanho do vídeo de entrada como este:

ffprobe -v error -of flat=s=_ -select_streams v:0 -show_entries stream=height,width in.mp4 

Com um ffmpeg razoavelmente recente, você pode redimensionar seu vídeo com estas opções:

ffmpeg -i in.mp4 -vf scale=720:480 out.mp4 

Você pode definir a largura ou altura para -1 para permitir ffmpeg redimensionar o vídeo mantendo a proporção. Na verdade, -2 é a melhor escolha, pois o valor calculado deve ser uniforme. Então você pode digitar:

ffmpeg -i in.mp4 -vf scale=720:-2 out.mp4 

Depois de obter o vídeo, ele pode ser maior do que o 720x480 esperado desde então você permite que ffmpeg calcule a altura, então você terá que cortá-la. Isso pode ser feito assim:

ffmpeg -i in.mp4 -filter:v "crop=in_w:480" out.mp4 

Finalmente, você poderia escrever um script como este (pode ser facilmente otimizado, mas mantive-o simples para legibilidade):

#!/bin/bash FILE="/tmp/test.mp4" TMP="/tmp/tmp.mp4" OUT="/tmp/out.mp4" OUT_WIDTH=720 OUT_HEIGHT=480 # Get the size of input video: eval $(ffprobe -v error -of flat=s=_ -select_streams v:0 -show_entries stream=height,width ${FILE}) IN_WIDTH=${streams_stream_0_width} IN_HEIGHT=${streams_stream_0_height} # Get the difference between actual and desired size W_DIFF=$[ ${OUT_WIDTH} - ${IN_WIDTH} ] H_DIFF=$[ ${OUT_HEIGHT} - ${IN_HEIGHT} ] # Let"s take the shorter side, so the video will be at least as big # as the desired size: CROP_SIDE="n" if [ ${W_DIFF} -lt ${H_DIFF} ] ; then SCALE="-2:${OUT_HEIGHT}" CROP_SIDE="w" else SCALE="${OUT_WIDTH}:-2" CROP_SIDE="h" fi # Then perform a first resizing ffmpeg -i ${FILE} -vf scale=${SCALE} ${TMP} # Now get the temporary video size eval $(ffprobe -v error -of flat=s=_ -select_streams v:0 -show_entries stream=height,width ${TMP}) IN_WIDTH=${streams_stream_0_width} IN_HEIGHT=${streams_stream_0_height} # Calculate how much we should crop if [ "z${CROP_SIDE}" = "zh" ] ; then DIFF=$[ ${IN_HEIGHT} - ${OUT_HEIGHT} ] CROP="in_w:in_h-${DIFF}" elif [ "z${CROP_SIDE}" = "zw" ] ; then DIFF=$[ ${IN_WIDTH} - ${OUT_WIDTH} ] CROP="in_w-${DIFF}:in_h" fi # Then crop... ffmpeg -i ${TMP} -filter:v "crop=${CROP}" ${OUT} 

Comentários

  • Tive a estranha sensação de que ‘ perderia um cenário, mas ‘ tentei com muitos arquivos de vídeo e parece que corta e redimensiona corretamente os vídeos para o tamanho absolutamente correto – muito bem!
  • parece que há algo errado com a decisão CROP_SIDE.
  • `# Obtenha a taxa entre o tamanho real e o desejado w_rate = echo "scale=3; ${in_width}/${out_width}*1000"| bc | awk '{printf "%d", $0}' h_rate = echo "scale=3; ${in_height}/${out_height}*1000"| bc | awk '{printf "%d", $0}' # Let ‘ s fica com o lado mais curto, então o vídeo será pelo menos tão grande # quanto o tamanho desejado e recorte o lado mais longo: crop_side = ‘ n ‘ if [$ {w_rate} -gt $ {h_rate}]; em seguida, dimensionar = ” -2: $ {out_height} ” crop_side = ‘ w ‘ else scale = ” $ {out_width}: – 2 ” crop_side = ‘ h ‘ fi `

Resposta

ffmpeg -i input.file -vf "scale=(iw*sar)*max(720/(iw*sar)\,480/ih):ih*max(720/(iw*sar)\,480/ih), crop=720:480" -c:v mpeg4 -vtag XVID -q:v 4 -c:a libmp3lame -q:a 4 output.avi 

Substitua” input.file “pelo nome do seu arquivo de entrada.

Comentários

  • Esta deve ser a melhor resposta, pois não ‘ não requer uma chamada para ffprobe. Observe as sequências de vírgulas de barra invertida no comando. Você ‘ precisará escapar das barras invertidas se ‘ colocar o comando em uma string C / JavaScript / PHP.
  • Legal, Brian. A parte do filtro de vídeo é exatamente o que eu precisava também. (ou seja, converter vídeos antigos de 4: 3 em 16: 9)!
  • gênio! tudo feito em um.
  • Muito mais limpo que o script acima. Observe que se você não ‘ não quiser XVID / MP3, poderá apenas alterar as tags após a segunda aspa para algo como -c:a copy scaled_result.mp4
  • você pode me explicar o que ‘ s sar dentro de iw*sar

Resposta

Se quiser cortar e dimensionar de uma vez, você pode fazer uma cadeia de filtros cortar e dimensionar desta forma:

ffmpeg -i SomeInput.mp4 -vf "crop=in_h*9/16:in_h,scale=-2:400" -t 4 SomeOutput.mp4 

O acima corta primeiro um vídeo para retrato 16: 9, depois escala para 400px de altura x largura apropriada (número par).

Resposta

Sou novo no ffmpeg, mas agora tenho um pequeno conversor em VB.NET que cria filmes brutos de vários formatos de saída para uso em pequenos dispositivos que têm acesso a cartão SD, mas não potência suficiente para decodificar vídeo complexo.

Devido à maneira como funciona ao redimensionar e cortar, tive que codificá-lo manualmente e construir os parâmetros. Basicamente, preciso saber a largura e a altura resultantes.

Tenho 2 caixas de seleção para as opções: –

Preservar proporção (X) Preencher todos os pixels (X)

Apenas 4 variáveis são necessárias como entrada (1) Largura do vídeo original, (2) Altura do vídeo original, (3) Largura do dispositivo, (4) Altura do dispositivo.

Embora para VB.NET possa ser adaptado facilmente para qualquer idioma.

 Dim crop As String = "" " will build this in ffmpeg format for -s or scale and crop If cbAspectRatio.Checked = False Then m_dest_output_w = sz._w m_dest_output_h = sz._h " scale to w * h - simple crop = " -s " & m_dest_output_w & ":" & m_dest_output_h Else Dim ratio As Double = CDbl(m_video_width) / CDbl(m_video_height) " this is aspect ratio of original unsized video If cbFillPixels.Checked = False Then " shrink to fit If sz._w * ratio <= m_video_height Then m_dest_output_w = sz._w m_dest_output_h = sz._w / ratio Else m_dest_output_h = sz._h m_dest_output_w = sz._h / ratio End If " no cropping just resizing to a non-filled area that fits crop = " -s " & m_dest_output_w & ":" & m_dest_output_h " no cropping needed as letterboxed Else " expand / fill --- cropping needed If sz._w * ratio >= m_video_height Then m_dest_output_w = sz._w m_dest_output_h = sz._w * ratio crop = ",crop=" & sz._w & ":" & sz._h & ":0:" & Math.Abs((m_dest_output_h - sz._h)) \ 2 Else m_dest_output_h = sz._h m_dest_output_w = sz._h * ratio crop = ",crop=" & sz._w & ":" & sz._h & ":" & Math.Abs((m_dest_output_w - sz._w)) \ 2 & ":0" End If crop = " -vf scale=" & m_dest_output_w & ":" & m_dest_output_h & crop m_dest_output_w = sz._w m_dest_output_h = sz._h End If End If 

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *