• ffmpeg 修改视频封面


    千金纵买相如赋,脉脉此情谁诉。

    https://raw.githubusercontent.com/longfeizheng/longfeizheng.github.io/master/images/java/java37.jpg

    概述

    有时候我们希望使用某一张图片作为视频素材的封面 ,而不是素材中的某帧。今天使用ffmpeg批量替换视频素材封面。

    环境装备

    官网下载安装 ffmpeg

    准备素材

    准备好视频素材和封面图片

    编写程序

    package cn.merryyou.file;
    
    import java.io.*;
    
    /**
     * 修改视频封面
     * Created by i@merryyou.cn on 2020/3/24
     *
     * @VERSION 1.0
     */
    public class ChangeVedioCover {
    
        public static final String FFMPEG_PATH = "D:/ffmpeg/bin/ffmpeg.exe"; // ffmpeg 程序迷路
        public static final String FILE_PATH = "E:/BaiduNetdiskDownload/测试"; //需要替换封面的视频目录
        public static final String IMAGE_PATH = "E:/BaiduNetdiskDownload/测试/1.png"; // 需要替换的封面照片
        public static final String COMMAND = "%s -i %s -i %s -map 1 -map 0 -c copy -disposition:0 attached_pic -y %s"; // ffmpeg 替换封面的命令
    
        public static void main(String[] args) throws Exception {
            printPath(new File(FILE_PATH));
        }
    
        public static void printPath(File file) throws IOException {
            File[] files = file.listFiles();
            for (File a : files) {
                System.out.println(a.getAbsolutePath());
                if (a.getAbsolutePath().endsWith(".mp4")) {
                    String newPath = a.getParent() + "/" + a.getName().substring(0, a.getName().lastIndexOf(".")) + "_.mp4"; // 新生成的文件名后面添加_ 下划线
                    String cmd = String.format(COMMAND, FFMPEG_PATH, a.getAbsolutePath(), IMAGE_PATH, newPath);
                    execCmd(cmd);
                    a.delete();// 删除源文件
                }
                if (a.isDirectory()) {
                    printPath(a);
                }
            }
        }
    
        public static void execCmd(String cmd) {
            ProcessBuilder builder = new ProcessBuilder("cmd.exe", "/C", cmd);
            Process process = null;
            try {
                process = builder.redirectErrorStream(true).start();
            } catch (IOException e) {
                e.printStackTrace();
            }
            InputStream in = process.getInputStream();
            outStream(in);
        }
    
        private static void outStream(InputStream in) {
            // 用一个读输出流类去读
            BufferedReader br = new BufferedReader(new InputStreamReader(in));
            String line;
            // 逐行读取输出到控制台
            try {
                while ((line = br.readLine()) != null) {
    //                System.out.println(line);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    

    效果如下

    修改封面前

    https://raw.githubusercontent.com/longfeizheng/longfeizheng.github.io/master/images/java/java38.png

    修改封面后

    https://raw.githubusercontent.com/longfeizheng/longfeizheng.github.io/master/images/java/java39.png

    总结

    更多ffmpeg 命令参考链接

  • 相关阅读:
    HDU 5546 深搜吧 主要是提取的时候容易重复
    HDU 5543 新型01背包 两端放一半就可以有其价值
    HDU 2586 查找两点之间的距离
    HDU 5652 二分加搜索 http://acm.split.hdu.edu.cn/showproblem.php?pid=5652
    美句
    最短路径问题
    1766 装果子
    Watchcow
    codevs 4768 跳石头
    noi 7219:复杂的整数划分问题
  • 原文地址:https://www.cnblogs.com/merryyou/p/12652207.html
Copyright © 2020-2023  润新知