zoukankan      html  css  js  c++  java
  • FFmpeg在JAVA中的使用-音频提取&字幕压缩

      由于项目需求中涉及到视频中音频提取,以及字幕压缩的功能,一直在研究ffmpeg,仅仅两个功能,却深受ffmpeg的折磨。

      今天谈谈ffmpeg在java中的简单使用,首先下载FFmpeg包,官方地址:http://ffmpeg.org/download.html,这里建议下载Linux Static Builds版本的,轻小而且解压后可以直接使用,我使用的版本是ffmpeg-git-20170922-64bit-static.tar.xz。

      解压之后,文件夹中有一个可执行文件ffmpeg,在linux上可以直接运行./ffmpeg -version,可以查看ffmpeg的版本信息,以及configuration配置信息。

      现在,可以使用ffmpeg的相关命令来进行一些操作:

      1.视频中音频提取:ffmpeg -i [videofile]  -vn -acodec copy [audiofile]

      2.字幕压缩至视频中:ffmpeg -i [videofile]  -vf subtitles=[subtitle.srt] [targetvideofile]

      3.其它相关命令可以查阅:http://ffmpeg.org/ffmpeg.html

      说明:

    • videofile是需要提取音频的视频源文件,可以是本地文件,也可以是网络文件url。
    • subtitle.srt是字幕文件(中文字幕即把英文变为中文,其它格式一致),这边就使用最简单的srt标准格式,如下所示:

      

    • 特别注意:srt文件写入的字符编码需要是UTF-8,否则压缩的时候会报无法读取srt文件;
    • 若想压缩中文字幕,需要系统中有中文字体,使用fc-list查询系统支持的字体,fc-list :lang=zh查询支持的中文字体
    • 相关java代码如下:

      

    public class FFMpegUtil {
    
        private static final Logger logger = Logger.getLogger(FFMpegUtil.class);
    
        // ffmpeg命令所在路径
        private static final String FFMPEG_PATH = "/ffmpeg/ffmpeg";
        // ffmpeg处理后的临时文件
        private static final String TMP_PATH = "/tmp";
        // home路径
        private static final String HOME_PATH;
    
        static {
            HOME_PATH = System.getProperty("user.home");
            logger.info("static home path : " + HOME_PATH);
        }
    
        /**
         * 视频转音频
         * @param videoUrl
         */
        public static String videoToAudio(String videoUrl){
            String aacFile = "";
            try {
                aacFile = TMP_PATH + "/" + new SimpleDateFormat("yyyyMMddHHmmss").format(new Date())
                        + UUID.randomUUID().toString().replaceAll("-", "") + ".aac";
                String command = HOME_PATH + FFMPEG_PATH + " -i "+ videoUrl + " -vn -acodec copy "+ aacFile;
                logger.info("video to audio command : " + command);
                Process process = Runtime.getRuntime().exec(command);
                process.waitFor();
            } catch (Exception e) {
                logger.error("视频转音频失败,视频地址:"+videoUrl, e);
            }
            return "";
        }
        
        /**
         * 将字幕烧录至视频中
         * @param videoUrl
         */
        public static String burnSubtitlesIntoVideo(String videoUrl, File subtitleFile){
            String burnedFile = "";
            File tmpFile = null;
            try {
                burnedFile = TMP_PATH + "/" + new SimpleDateFormat("yyyyMMddHHmmss").format(new Date())
                        + UUID.randomUUID().toString().replaceAll("-", "") + ".mp4";
                String command = HOME_PATH + FFMPEG_PATH + " -i "+ videoUrl + " -vf subtitles="+ subtitleFile +" "+ burnedFile;
                logger.info("burn subtitle into video command : " + command);
                Process process = Runtime.getRuntime().exec(command);
                process.waitFor();
            } catch (Exception e) {
                logger.error("视频压缩字幕失败,视频地址:"+videoUrl+",字幕地址:"+subtitleUrl, e);
            }
            return "";
        }
    }

     

  • 相关阅读:
    晶振故障原因
    国外被疯赞的一篇神文:你该增加人生技能了(转)
    Python学习笔记-Day27-正则表达式
    Python学习笔记-Day25-模块(hashlib、configpaser,logging)
    Python学习笔记-Day24-collections模块
    Python学习笔记-Day23-模块(时间、随机数、sys、os)
    Python学习笔记-Day22-内置方法及序列化模块
    Python学习笔记-Day21-反射、__str__、__repr__
    @classmethod 与 @staticmethod
    @property(setter、deleter)将类中的方法伪装成属性
  • 原文地址:https://www.cnblogs.com/handsomeye/p/7656084.html
Copyright © 2011-2022 走看看