十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
本篇内容主要讲解“怎么使用ffmpeg实现视频转视频”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么使用ffmpeg实现视频转视频”吧!
创新互联公司是专业的侯马网站建设公司,侯马接单;提供成都做网站、网站制作、成都外贸网站建设,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行侯马网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!
主要用到了FFmpeg这个工具,利用命令对视频文件进行操作。首先根据自己调的参数进行图片的截取(本文的是1秒10帧的参数),图片转换,然后分离音频,最后字符图片和音频合成目标视频。
FFmpeg的代码库:
https://github.com/FFmpeg/FFmpeg
FFmpeg下载地址:
https://ffmpeg.org/download.html
本位使用的版本:
https://blog-lossingdawn.oss-cn-shanghai.aliyuncs.com/img2text/ffmpeg-20180201-b1af0e2-win64-static.zip
没做细致的调整,视频的转换可以调调参数
@Test public static void videoTest() { String srcVideoPath = "F:/123/123.mp4"; String tarImagePath = "F:/123/mp/"; String tarAudioPath = "F:/123/mp/audio.aac"; String tarVideoPath = "F:/123/1234.mp4"; VideoUtil.readVideo(srcVideoPath,tarImagePath,tarAudioPath,tarVideoPath); }
主要用到的几个命令,其他按帧截图命令参考文末链接4:
// 截图 ffmpeg -ss 10 -i input.flv -y -f image2 -vframes 100 -s 352x240 b-%03d.jpg // 分离音频 ffmpeg -i 3.mp4 -vn -y -acodec copy 3.aac // 合成视频 ffmpeg -threads2 -y -r 10 -i /tmpdir/image%04d.jpg -i audio.mp3 -absf aac_adtstoasc output.mp4
JDK 1.8
// ffmpeg -ss 10 -i input.flv -y -f image2 -vframes 100 -s 352x240 b-%03d.jpg /** * ffmpeg 截图,并指定图片的大小 * * @param srcVideoPath * @param tarImagePath * 截取后图片路径 * @param width * 截图的宽 * @param hight * 截图的高 * @param offsetValue * 表示相对于文件开始处的时间偏移值 可以是分秒 * @param vframes * 表示截图的桢数 * * @return */ public static boolean processFfmpegImage(String srcVideoPath, String tarImagePath, int width, int hight, float offsetValue, float vframes) { if (!checkfile(srcVideoPath)) { System.out.println("【" + srcVideoPath + "】 不存在 !"); // logger.error("【" + srcVideoPath + "】 不存在 !"); return false; } Listcommend = new java.util.ArrayList (); commend.add(ffmpegPath); commend.add("-i"); commend.add(srcVideoPath); commend.add("-y"); commend.add("-f"); commend.add("image2"); commend.add("-ss"); commend.add(offsetValue + ""); // 在视频的某个插入时间截图,例子为5秒后 // commend.add("-vframes"); commend.add("-t");// 添加参数"-t",该参数指定持续时间 commend.add(vframes + ""); // 截图的桢数,添加持续时间为1毫秒 commend.add("-s"); commend.add(width + "x" + hight); // 截图的的大小 commend.add(tarImagePath); try { ProcessBuilder builder = new ProcessBuilder(); builder.command(commend); builder.redirectErrorStream(true); // builder.redirectOutput(new File("F:/123/log/log.log")); Process process = builder.start(); doWaitFor(process); process.destroy(); if (!checkfile(tarImagePath)) { System.out.println(tarImagePath + " is not exit! processFfmpegImage 转换不成功 !"); // logger.info(tarImagePath + " is not exit! processFfmpegImage // 转换不成功 !"); return false; } return true; } catch (Exception e) { e.printStackTrace(); System.out.println("【" + srcVideoPath + "】 processFfmpegImage 转换不成功 !"); // logger.error("【" + srcVideoPath + "】 processFfmpegImage 转换不成功 // !"); return false; } } public static boolean processFfmpegAudio(String srcVideoPath, String tarAudioPath) { if (!checkfile(srcVideoPath)) { System.out.println("【" + srcVideoPath + "】 不存在 !"); // logger.error("【" + srcVideoPath + "】 不存在 !"); return false; } // https://blog.csdn.net/xiaocao9903/article/details/53420519 // ffmpeg -i 3.mp4 -vn -y -acodec copy 3.aac // ffmpeg -i 3.mp4 -vn -y -acodec copy 3.m4a List commend = new java.util.ArrayList (); commend.add(ffmpegPath); commend.add("-i"); commend.add(srcVideoPath); commend.add("-vn"); commend.add("-y"); commend.add("-acodec"); commend.add("copy"); // 在视频的某个插入时间截图,例子为5秒后 commend.add(tarAudioPath); try { ProcessBuilder builder = new ProcessBuilder(); builder.command(commend); builder.redirectErrorStream(true); Process process = builder.start(); doWaitFor(process); process.destroy(); if (!checkfile(tarAudioPath)) { System.out.println(tarAudioPath + " is not exit! processFfmpegAudio 转换不成功 !"); return false; } return true; } catch (Exception e) { e.printStackTrace(); System.out.println("【" + srcVideoPath + "】 processFfmpegAudio 转换不成功 !"); return false; } } /** * ffmpeg 合成视频 * * @param srcVideoPath * @param tarImagePath * 截取后图片路径 * @param width * 截图的宽 * @param hight * 截图的高 * @param offsetValue * 表示相对于文件开始处的时间偏移值 可以是分秒 * @param vframes * 表示截图的桢数 * * @return */ public static boolean processFfmpegVideo(String imagePath, String audioPath, String tarVideoPath, int step) { // https://blog.csdn.net/wangshuainan/article/details/77914508?fps=1&locationNum=4 // 带音频 // ffmpeg -threads2 -y -r 10 -i /tmpdir/image%04d.jpg -i audio.mp3 -absf // aac_adtstoasc output.mp4 List commend = new java.util.ArrayList (); commend.add(ffmpegPath); commend.add("-threads"); commend.add("2"); commend.add("-y"); commend.add("-r"); commend.add(step + ""); commend.add("-i"); commend.add(imagePath); // 图片 commend.add("-i"); commend.add(audioPath); commend.add("-absf");// commend.add("aac_adtstoasc"); // commend.add(tarVideoPath); try { ProcessBuilder builder = new ProcessBuilder(); builder.command(commend); builder.redirectErrorStream(true); builder.redirectOutput(new File("F:/123/log/log.log")); Process process = builder.start(); doWaitFor(process); process.destroy(); if (!checkfile(tarVideoPath)) { System.out.println(tarVideoPath + " is not exit! processFfmpegVideo 转换不成功 !"); return false; } return true; } catch (Exception e) { e.printStackTrace(); System.out.println("【" + tarVideoPath + "】 processFfmpegVideo 转换不成功 !"); return false; } }
到此,相信大家对“怎么使用ffmpeg实现视频转视频”有了更深的了解,不妨来实际操作一番吧!这里是创新互联网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!