2

У меня есть большая коллекция видеофайлов mkv и mp4 в формате 4:3. Я пытаюсь изменить размер самого большого из них, до более удобного размера 640x480. Это отчасти для экономии места на диске, а также для того, чтобы их было легче наблюдать на экране ноутбука, и потреблять меньше процессорных циклов для их воспроизведения.

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

Но это оставляет мне очень сложную команду для ffmpeg, показанную ниже. Что я пропускаю? Есть ли более простая командная строка, которую я могу использовать с ffmpeg, которая все равно будет справляться с воспроизведением кодировки, использованной во входном файле?

::  Resize Image to 640x480 (e.g. 960x720 x 2/3)

::  Input File (WITH .ext)
SET input=video_960x720_320kbps.mkv

::  Resize from 960x720 to 640x480 (i.e. 960x720 x 2/3)

::  Resize Picture to 2/3rd
    SET multiply=2
    SET divide=3

::  Location of FFMPEG (64-bit)
SET ffmpeg="C:\Program Files\FFmpeg\ffmpeg.exe" -hide_banner -threads 1


::  *** MATCH INPUT FILE'S SETTINGS : Input file analysed by MediaInfo ***

::  **  Command Line : 2 Pass Encoding : 320 kbps x 2/3 + Headroom = 240 kbps : Input = MKV  **

::  Video - Advanced Video Codec (AVC), High@L5 - Constant Bitrate, Framerate defaults to Input file's framerate

::  Overwrite a Profile with the x264-params option
SET x264opts="ref=16:deblock=1,1,2:me_range=32:trellis=0:bframes=5:open_gop=0:min-keyint=300:keyint_min=23:bitrate=240:qpmin=12:qpmax=60:qpstep=10:threads=1"

SET mapping=-i "%input%" -itsoffset 0 -i "%input%"  -map 0:v -map 1:a  -copyts
SET options=-preset veryslow  -profile:v high -level 5 -x264-params %x264opts%  -pix_fmt yuv420p
SET command=%ffmpeg% %mapping% -c:v libx264 %options% -vf "scale=iw*%multiply%/%divide%:-1" -c:a copy  -sn  -map_metadata 0
%command% -y -pass 1 -flags global_header -f matroska nul  &&  %command% -pass 2 -flags global_header -movflags faststart "output_640x480_240kbps.mkv"

1 ответ1

2

Нет смысла « воспроизводить используемую кодировку ». Это просто историческая информация, и использование тех же настроек не приведет к более эффективному перекодированию. Если вы хотите снизить нагрузку на процессор, используйте более низкий профиль. refs=16 и bframes=5 сделают все наоборот, потребляя меньше процессорных циклов. Подойдёт однопроходная CRF, нет необходимости в двухпроходном режиме среднего битрейта.

Вы также принимаете данные дважды и применяете смещение TS 0 (!). Зачем?

ffmpeg -i in -vf scale=640:480:force_original_aspect_ratio=decrease,pad=640:480:(ow-iw)/2:(oh-ih)/2,setsar=1,format=yuv420p -c:v libx264 -crf 22 -profile:v main -c:a copy -sn -map_metadata 0 out.mkv

Вы можете пропустить пэд-фильтр, если вход точно 4:3.

Если полученный размер слишком велик, увеличьте значение CRF.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .