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 "";
        }
    }

     

  • 相关阅读:
    learnyou 相关网站
    hdu 3038 How Many Answers Are Wrong
    hdu 3047 Zjnu Stadium 并查集高级应用
    poj 1703 Find them, Catch them
    poj 1182 食物链 (带关系的并查集)
    hdu 1233 还是畅通工程
    hdu 1325 Is It A Tree?
    hdu 1856 More is better
    hdu 1272 小希的迷宫
    POJ – 2524 Ubiquitous Religions
  • 原文地址:https://www.cnblogs.com/handsomeye/p/7656084.html
Copyright © 2011-2022 走看看