Java使用FFmpeg处理视频[视频直播三]

2021-01-23 01:15

阅读:733

标签:discuss   esc   语法   te pro   more   als   exist   sum   apach   

承接上文。

【拓展】

有人问我,怎么配置互联网环境的Mevan,这里拓展一下。

技术图片

settings_outweb.xml

    

继续正题,上篇咱们讲到 使用命令可以完成一系列的操作

1、视频格式转换:ffmpeg -i 123.mp4 newVideo.avi

技术图片

**2、视频分段:ffmpeg -i 80s.mp4 -c:v libx264 -c:a aac -strict -2 -f hls -hls_list_size 0 -hls_time 60 output/output.m3u8

**3、音视频合并:ffmpeg -i test2.mp3 -i test1.mp4 -t 10 -y newVideo.mp4

等等,详见官方文档
《英文版的哦》

其实,这里只是做了一点,使用Java执行上述命令。

【ffmpeg与Java实现视频转换小demo】

    package com.example.demo;

    import org.assertj.core.util.Lists;
    import org.junit.Test;

    import java.io.BufferedReader;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.util.List;

    public class MediaUtil {
            /**
             * 简易视频处理 -- (cmd(windows): ffmpeg.exe -i test1.mp4 newVideo.avi)
             *
             * @param ffmpegPath      ffmpeg.exe文件路径,可在rest或者admin中进行配置,使用配置文件进行读取
             * @param videoInputPath  视频文件路径(输入)
             * @param videoOutputPath 转换完成的文件路径(输出)
             * @throws Exception
             */
            public static void videoConvert(String ffmpegPath, String videoInputPath, String videoOutputPath) throws Exception {
                    // 构建命令
                    List command = Lists.newArrayList();
                    command.add(ffmpegPath);
                    command.add("-i");
                    command.add(videoInputPath);
                    command.add(videoOutputPath);
                    // 执行操作
                    ProcessBuilder builder = new ProcessBuilder(command);
                    Process process = builder.start();
                    InputStream errorStream = process.getErrorStream();
                    InputStreamReader isr = new InputStreamReader(errorStream);
                    BufferedReader br = new BufferedReader(isr);
                    String line = "";
                    while ((line = br.readLine()) != null) {
                    }
                    if (br != null) {
                            br.close();
                    }
                    if (isr != null) {
                            isr.close();
                    }
                    if (errorStream != null) {
                            errorStream.close();
                    }
            }

            @Test
            public void testVideoConvert() {
                    String ffmpegPath = "ffmpeg";
                    String videoInputPath = "D:\\Frozen\\frozen_nb\\video\\realvideo\\123.mp4";
                    String videoOutputPath = "D:\\Frozen\\frozen_nb\\video\\realvideo\\newVideo.avi";
                    //fmpegProperties ffmpegProperties = SpringContextHolder.getBean(FfmpegProperties.class);
                    //ffmpegProperties.getFfmpegFile()
                    try {
                            videoConvert(ffmpegPath, videoInputPath, videoOutputPath);
                    } catch (Exception e) {
                            e.printStackTrace();
                    }
            }
    }

技术图片

漫长的等待其转换完成......
技术图片

5分多钟,视频终于转换完成了

播放正常

技术图片

其他未详尽事宜,参见:《FFmpeg基本语法》

【再来一个小demo】

    /**
             * 获取第一秒第一帧的缩略图 -- (cmd(windows): ffmpeg.exe -ss 00:00:01 -y -i test1.mp4 -vframes 1 new.jpg)
             *
             * @param ffmpegPath      ffmpeg.exe文件路径,可在rest或者admin中进行配置,使用配置文件进行读取
             * @param videoInputPath  视频文件路径(输入)
             * @param coverOutputPath 缩略图输出路径
             * @throws Exception
             */
            public static void getVideoCover(String ffmpegPath, String videoInputPath, String coverOutputPath) throws Exception {
                    // 构建命令
                    List command = Lists.newArrayList();
                    command.add(ffmpegPath);
                    command.add("-ss");
                    command.add("00:45:22");
                    command.add("-y");
                    command.add("-i");
                    command.add(videoInputPath);
                    command.add("-vframes");
                    command.add("1");
                    command.add(coverOutputPath);
                    // 执行操作
                    ProcessBuilder builder = new ProcessBuilder(command);
                    Process process = builder.start();
                    InputStream errorStream = process.getErrorStream();
                    InputStreamReader isr = new InputStreamReader(errorStream);
                    BufferedReader br = new BufferedReader(isr);
                    String line = "";
                    while ((line = br.readLine()) != null) {
                    }
                    if (br != null) {
                            br.close();
                    }
                    if (isr != null) {
                            isr.close();
                    }
                    if (errorStream != null) {
                            errorStream.close();
                    }
            }

            @Test
            public void testGetVideoCover() {
                    String videoInputPath = "D:\\Frozen\\frozen_nb\\video\\realvideo\\123.mp4";
                    String videoOutputPath = "D:\\Frozen\\frozen_nb\\video\\realvideo\\frozen.jpg";
                    try {
                            getVideoCover("ffmpeg", videoInputPath, videoOutputPath);
                    } catch (Exception e) {
                            e.printStackTrace();
                    }
            }

技术图片

Java使用FFmpeg处理视频[视频直播三]

标签:discuss   esc   语法   te pro   more   als   exist   sum   apach   

原文地址:https://blog.51cto.com/13479739/2495006


评论


亲,登录后才可以留言!