Intereting Posts
Блокировка исходящих соединений с iptables Quotes exercise – как сделать ssh внутри ssh во время запуска sql внутри второго ssh? Как планировать выполнение задачи каждый день, если я не знаю, когда компьютер будет включен? Есть ли замена «ls», которая может обрабатывать подстановочные знаки? «При чтении -r LINE; do "заменяет несколько пробелов одним пробелом Восстановление из прерванного перемещения раздела Текстовая обработка только для условий, встречающихся в строке X до Y Извлечение данных из свободного места на диске 600Go после того, как этот диск был dd = / dev / {этот диск} с данными 4Go Распространение приложения с .so-файлами? Утилита для отображения и изменения модулей ядра, загружаемых при запуске системы Как получить имена файлов при использовании find и sed Значения отображения xmllint более 1 атрибута в одном исполнении Разрешения: Каков правильный способ предоставить Apache больше прав пользователя? не удалось войти в солярий Судо долго ждать пользователя Active Directory

Преобразование видео в фиксированный размер экрана путем обрезки и изменения размера

Я пытался понять это сам, но множество вариантов меня просто сбивает с толку.

Я хочу использовать в идеале либо ffmpeg либо mencoder (или что-то еще, но те два, которые, как я знаю, у меня работает) для преобразования любого входящего видео в фиксированный размер экрана.

Если видео является более широким или слишком коротким для него, тогда обрезайте видео. Если это не правильный размер, измените размер вверх или вниз, чтобы сделать его точно фиксированным размером экрана.

Точной последней вещью, в которой я нуждаюсь, является 720×480 в XVID AVI с аудиодорожкой MP3.

Я нашел много страниц, показывающих, как изменить размер до максимального разрешения, но мне нужно, чтобы видео было именно таким разрешением (с дополнительными деталями, обрезанными, без черных полос).

Может ли кто-нибудь сказать мне, что запускается командная строка, или, по крайней мере, получить от меня какую-то часть? Если для этого требуется несколько командных строк (запустите X, чтобы получить разрешение, сделайте это вычисление, а затем запустите Y с выходом этого вычисления), я могу это сделать.

Я не ffmpeg гуру, но это должно сделать трюк.

Прежде всего, вы можете получить размер входного видео следующим образом:

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

При достаточно недавнем ffmpeg вы можете изменить размер своего видео с помощью следующих параметров:

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

Вы можете установить ширину или высоту в -1 , чтобы позволить ffmpeg изменять размер видео, сохраняя соотношение сторон. На самом деле, -2 – лучший выбор, поскольку расчетное значение должно быть даже. Таким образом, вы можете ввести:

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

Как только вы получите видеоролик, он может быть больше, чем ожидаемый 720x480 поскольку вы позволяете ffmpeg вычислять высоту, поэтому вам придется обрезать его. Это можно сделать следующим образом:

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

Наконец, вы можете написать сценарий, подобный этому (его можно легко оптимизировать, но я оставил его простым для удобочитаемости):

 #!/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} 
 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 

Замените «input.file» на имя вашего входного файла.

Если вы хотите обрезать и масштабировать за один раз, вы можете сделать тактику фильтра масштаба потомка следующим образом:

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

Вышеприведенное выше отображает видеоролик с портретом 16: 9, затем масштабируется до 400 пикселей в высоту x с соответствующей (четной) шириной.

Я новичок в ffmpeg, но теперь у меня есть хороший конвертер, который собирается в VB.NET, который создает сырые фильмы с различными форматами вывода для использования на небольших устройствах, имеющих доступ к SD-карте, но недостаточно для декодирования сложного видео.

Из-за того, как он работает при изменении размера и обрезке, я должен был его вручную закодировать и построить параметры. В основном мне нужно знать результирующую ширину и высоту.

У меня есть 2 флажка для опций: –

Сохранять соотношение сторон (X) Заполнить все пиксели (X)

В качестве входных данных необходимы только 4 переменные (1) Ширина исходного видео, (2) Высота оригинального видео, (3) Ширина устройства, (4) Высота устройства.

Хотя для VB.NET можно было легко адаптироваться для любого языка.

  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