FFmpeg 踩坑记录

   日期:2020-09-11     浏览:108    评论:0    
核心提示:本菜鸟使用的FFmpeg封装工具为 FFmpegCommand 感谢大佬,非常好用。FFmpegCommand 链接:https://github.com/AnJoiner/FFmpegCommandFFmpeg FAQ:https://ffmpeg.org/faq.html#How-can-I-concatenate-video-files_003f使用FFmpeg 处理视频后,得到0kb文件:原因:由于项目使用的为 MediaRecorder录制视频。视频的编码为H264.而FFmp..

本菜鸟使用的FFmpeg封装工具为 FFmpegCommand 感谢大佬,非常好用。

FFmpegCommand 链接:https://github.com/AnJoiner/FFmpegCommand

FFmpeg FAQ :https://ffmpeg.org/faq.html#How-can-I-concatenate-video-files_003f

使用FFmpeg 处理视频后,得到0kb文件:

原因:由于项目使用的为 MediaRecorder 录制视频。视频的编码为H264.而FFmpeg不支持这种视频编码。需要转码。

ffmepg官方文档说明:

本人解决方法:

1,将原视频转为 .m3u8的视频流。使用的FFmpegCommand中的 video2HLS()方法

    
    public static String[] video2HLS(String srcFile, String targetFile, int splitTime) {
        String command = "ffmpeg -y -i %s -c copy -bsf:v h264_mp4toannexb -hls_time %s %s";
        command = String.format(command, srcFile, splitTime, targetFile);
        return command.split(" ");
    }

2,将生成的.m3u8的视频流合成视频。(本菜鸟就直接合成.mp4文件了)


    public static String[] hls2Video(String m3u8Index, String targetFile) {
        String command = "ffmpeg -y -i %s -c copy %s";
        command = String.format(command, m3u8Index, targetFile);
        return command.split(" ");
    }

3,再用处理好的视频文件进行视频合成操作。


    public static String[] concatVideo(String inputFile, String targetFile) {
        // ffmpeg -f concat -i inputs.txt -c copy output.flv
        String command = "ffmpeg -y -f concat -i %s -codec copy %s";
        command = String.format(command, inputFile, targetFile);
        return command.split(" ");//以空格分割为字符串数组
    }

本人相关代码

 String videoName = "stitching_child_" + i + ".mp4";
 String targetName = "target_child_" + i + ".m3u8";
 String targetVideoName = "target_child_" + i + ".mp4";
 if (FileUtils.copy2MemoryName(mActivity, info.getPath(), videoName)) {
        String childPath = new File(mActivity.getExternalCacheDir(), videoName).getAbsolutePath();  //初始视频文件
        String targetPath = new File(mActivity.getExternalCacheDir(), targetName).getAbsolutePath();    //合成的m3u8视频流
        FFmpegCommand.runSync(FFmpegUtils.video2HLS(childPath, targetPath, 10));    //将初始文件转为m3u8视频流
        String targetVideoPath = new File(mActivity.getExternalCacheDir(), targetVideoName).getAbsolutePath();  //获取m3u8视频流路径
        FFmpegCommand.runSync(FFmpegUtils.hls2Video(targetPath, targetVideoPath));  //将m3u8视频流转为mp4文件。
        videoPaths.add(FileUtils.getFileName(targetVideoPath)); //添加到需要处理的文件list里面
        FileUtils.deleteCacheFile(mActivity, videoName);    //删除多余文件
        FileUtils.deleteCacheFile(mActivity, targetName);
      }

FFmpegCommand.runAsync(FFmpegUtils.concatVideo(cachePath, targetPath), new CommonCallBack(){回调});    //合并视频

有其他解决方法也望大佬指教~

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服