使用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();
- }
- }