我希望创建一个批处理文件,将视频文件(MP4 或 MKV)压缩为特定大小的 MP4 文件。
类似这样的情况,视频比特率会自动调整,导致最终文件大小约为 500MB。
由于视频文件有两种音频比特率,因此方程中会有一个额外的变量。一个运行 128k,另一个运行 384k。
ffmpeg -i "%%g" -c:v libx264 -b:v 1400k -vf "scale=720:-2" -c:a copy "converted\%%~ng.mp4"
答案1
通过计算视频的持续时间和实现该大小所需的视频比特率,将视频转换/编码为您选择的大小,并使用您选择的音频比特率:
测试输出为 15 秒 1280x720 h264 视频 aac 音频 .mp4,位于文件夹 \converted 中
最终输出为全长 1280x720 h264 视频 aac 音频 .mp4,位于文件夹 \converted 中
看起来rem test
:zmath
有效,但不雅致。
您想要一个 500MB 的视频,长度为 5 分 20 秒。如果您想要 128Kb 的音频比特率,那么视频比特率应该是:
((500000KB * 8) / 320s) - 128Kbits
(200.000/320)-128= 497Kbits
为什么是“size * 8”?因为大小以字节为单位,而比特率以位为单位(1字节=8位)。
如何使用 cmd、set /p、for、ffprobe、set /a 和编码来确定要通过(输入大小/计算的持续时间)-(输入音频比特率)编码的视频比特率ffmpeg:
添加到dir *.mkv *.mp4
。更改rem test
。更改?输出到converted
文件夹。
@rem Convert / encode a video to a size of your choice, with an audio bitrate of your choice by calculating the duration of the video and the video bitrate needed to achieve that size:
@rem https://superuser.com/a/1551554/1003800
@rem Windows 10 64-bit 051420
@echo off
ECHO.
ECHO What audio rate do you want in Kb?
SET /p zaudio="Default 128 or enter your own number "
IF /i not defined zaudio SET zaudio=128
ECHO.
ECHO What file size do you want in MB?
SET /p zsize="Default 500 or enter your own number "
IF /i not defined zsize SET zsize=500
for /F "eol=; delims=" %%g in ('dir *.mkv *.mp4 /A-D /B 2^>nul') do (
for /F "delims=" %%h in ('ffprobe.exe -v error -show_entries format^=duration -of default^=noprint_wrappers^=1:nokey^=1 "%%g" 2^>^&1') do set "zduration=%%h"
echo.
echo Duration is %zduration% seconds.
rem set z
rem pause
Call :zmath
if not exist converted md converted
echo.
setlocal enabledelayedexpansion
rem test
ffmpeg -ss 00:01:00 -y -i "%%g" -crf 20.0 -vcodec libx264 -b:v !zvideo! -filter:v scale=1280:720 -preset slow -acodec aac -ar 48000 -b:a !zaudio! -async 48000 -t 00:00:15 "converted\%%~ng.mp4"
rem ffmpeg -i "%%g" -crf 20.0 -vcodec libx264 -b:v !zvideo! -filter:v scale=1280:720 -preset slow -acodec aac -ar 48000 -b:a !zaudio! -async 48000 "converted\%%~ng.mp4"
rem production
setlocal disabledelayedexpansion
rem Begin restore variables for next run
rem remove k from zaudio
set zaudio=%zaudio:~,-1%
rem restore zsize to MB
set /a zsize=zsize/1000
set zvideo=
rem End restore variables for next run
)
exit /b
:zmath
rem begin convert MB to Kb
set /a zsize=zsize * 1000
rem end convert MB to Kb
set /a zvideo=((zsize * 8 / zduration) - zaudio) / 1
rem begin remove trailing whitespace and append letter k on zaudio
set /a zaudio=zaudio/1
set zaudio=%zaudio%k
rem end remove trailing whitespace and append letter k on zaudio
rem set z
rem pause
exit /b
看https://ffmpeg.zeranoe.com/forum/viewtopic.php?t=407
看https://stackoverflow.com/a/40102931/8826818
看https://www.google.com/search?&q=windows+10+cmd+set+%2Fa+missing+operator
看用于视频和音频编辑的有用 FFMPEG 命令列表打印友好 500k .pdf
看用于视频和音频编辑的有用 FFMPEG 命令列表在 techbeasts.com 上: