使用FFmpeg给视频增加黑边需要用到 pad 这个滤镜,具体用法如下:
-vf pad=1280:720:0:93:black
按照从左到右的顺序依次为:
“宽”、“高”、“X坐标”和“Y坐标”,宽和高指的是输入视频尺寸(包含加黑边的尺寸),XY指的是视频所在位置。
比如一个输入视频尺寸是1280x534的源,想要加上黑边变成1280x720,那么用上边的语法可以实现,93是这样得来的,(720-534)/2。
如果视频原始1920x800的话,完整的语法应该是:
-vf 'scale=1280:534,pad=1280:720:0:93:black'
先将视频缩小到1280x534,然后在加入黑边变成1280x720,将1280x534的视频放置在x=0,y=93的地方,
FFmpeg会自动在上下增加93像素的黑边。
注:black可以不写,默认是黑色
举例: 我原视频尺寸是 960*442
现在需要改成分辨率为720*1280 并且视频保持原比例,其余黑边填充
首先就分把视频转为 720*316
316的算法 442/(960/720)取整
482算法 (1280-316)/2
-vf 'scale=720:619,pad=720:1280:0:482:black'
具体代码
/**
* @Author
* @Description 修改视频分辨率
* @Date 9:02 2022/7/21
* @Param [sourcePath, targetPath, height, width]
* @return void
**/
public static void updateDpiAudio(String sourcePath, String targetPath,Integer height,Integer width) throws Exception {
try {
ProcessWrapper ffmpeg = new DefaultFFMPEGLocator().createExecutor();
ffmpeg.addArgument("-i");
ffmpeg.addArgument(sourcePath);
ffmpeg.addArgument("-vf");
//视频宽:720
BigDecimal widthRatio = new BigDecimal(width).divide(new BigDecimal(720),1,BigDecimal.ROUND_UP);
BigDecimal heightReal = new BigDecimal(height).divide(widthRatio,BigDecimal.ROUND_UP);
BigDecimal value = new BigDecimal(1280).subtract(heightReal).divide(new BigDecimal(2),BigDecimal.ROUND_UP);
ffmpeg.addArgument("scale=720:"+heightReal.intValue()+",pad=720:1280:0:"+value.intValue()+":black");
ffmpeg.addArgument(targetPath);
ffmpeg.execute();
try (BufferedReader br = new BufferedReader(new InputStreamReader(ffmpeg.getErrorStream()))) {
blockFfmpeg(br);
}
log.info("转化视频分辨率成功={}", targetPath);
} catch (IOException e) {
throw new Exception("转化视频分辨率失败");
}
}
public static void main(String[] args) {
try {
updateDpiAudio("D:\\pic\\a\\6977276173130827137.mp4","D:\\pic\\a\\测试转码测试.mp4",442,960);
} catch (Exception e) {
e.printStackTrace();
}
}