使用Java和ffmpeg把音频和视频合成视频的操作方法
FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证(依据你选择的组件)。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多codec都是从头开发的。
FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。它包括了目前领先的音/视频编码库libavcodec。 FFmpeg是在Linux下开发出来的,但它可以在包括Windows在内的大多数操作系统中编译。这个项目是由Fabrice Bellard发起的,现在由Michael Niedermayer主持。可以轻易地实现多种视频格式之间的相互转换,例如可以将摄录下的视频avi等转成现在视频网站所采用的flv格式
主要功能:
1、视频格式转换功能
ffmpeg视频转换功能。视频格式转换,比如可以将多种视频格式转换为flv格式,可不是视频信号转换 。
ffmpeg可以轻易地实现多种视频格式之间的相互转换(wma,rm,avi,mod等),例如可以将摄录下的视频avi等转成现在视频网站所采用的flv格式。
2、视频截图功能
对于选定的视频,截取指定时间的缩略图。视频抓图,获取静态图和动态图,不提倡抓gif文件;因为抓出的gif文件大而播放不流畅
3、给视频加水印功能
使用ffmpeg 视频添加水印(logo)。
好了,下面开始今天的正文。
借助第三方工具ffmpeg合成视频
需求:在小破站上下载了一些视频,但是放到电脑里面看,我擦,声音文件和视频文件是分开的。
- 正确安装ffmpeg并配置好环境变量。
- Java代码测试
里面是下载的视频和音频
我就上代码递归了,只要用正确的ffmpeg的命令和Java调用ffmpeg.exe的程序,就可以合成啦。
package com.lovely.test; import java.io.BufferedReader; import java.io.File; //import java.io.FileInputStream; //import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.text.SimpleDateFormat; import java.util.Date; import java.util.UUID; /** * * 视频中获取音频文件 * */ public class TestFfmpeg { // FFmpeg全路径 private static final String FFMPEG_PATH = "D:\\softWare\\tools\\joyTool\\ffmpeg\\bin\\ffmpeg.exe"; public static void main(String[] args) { String path = "E:\\StudyVedio\\ComputerScience\\US"; try { getAll(path); } catch (Exception e) { e.printStackTrace(); } } /** * 具体合成视频函数 * @param videoInputPath * 原视频的全路径 * * @param audioInputPath * 音频的全路径 * * @param videoOutPath * 视频与音频结合之后的视频的路径 */ public static void convetor(String videoInputPath, String audioInputPath, String videoOutPath) throws Exception { Process process = null; InputStream errorStream = null; InputStreamReader inputStreamReader = null; BufferedReader br = null; try { // ffmpeg命令 String command = FFMPEG_PATH + " -i " + videoInputPath + " -i " + audioInputPath + " -c:v copy -c:a aac -strict experimental " + " -map 0:v:0 -map 1:a:0 " + " -y " + videoOutPath; process = Runtime.getRuntime().exec(command); errorStream = process.getErrorStream(); inputStreamReader = new InputStreamReader(errorStream); br = new BufferedReader(inputStreamReader); // 用来收集错误信息的 String str = ""; while ((str = br.readLine()) != null) { System.out.println(str); } process.waitFor(); } catch (IOException e) { e.printStackTrace(); } finally { if (br != null) { br.close(); } if (inputStreamReader != null) { inputStreamReader.close(); } if (errorStream != null) { errorStream.close(); } } } // 递归函数 public static void getAll(String path) throws Exception { String videoInputPath = ""; String audioInputPath = ""; String videoOutPath = ""; File file = new File(path); if (file.isDirectory()) { File[] files = file.listFiles(); for (File f : files) { getAll(f.getPath()); if (f.isFile()) { if (f.getName().endsWith(".m4s")) { if (f.getName().endsWith("audio.m4s")) audioInputPath = file.getPath() + "\\audio.m4s"; if (f.getName().endsWith("video.m4s")) videoInputPath = file.getPath() + "\\video.m4s"; videoOutPath = file.getPath() + "\\all.mp4"; if (!videoInputPath.equals("")) convetor(videoInputPath, audioInputPath, videoOutPath); } } } } } }
我最后用了好几分钟合成了30个完整的视频。体会了递归的强大。
总结
到此这篇关于使用Java和ffmpeg把音频和视频合成视频的操作方法的文章就介绍到这了,更多相关java ffmpeg音频合成视频内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Java String类简单用法实战示例【字符串输出、比较】
这篇文章主要介绍了Java String类简单用法,结合具体实例形式分析了Java使用String类实现字符串的输出和比较功能相关操作技巧,需要的朋友可以参考下2019-07-07Java Collections的emptyList、EMPTY_LIST详解与使用说明
这篇文章主要介绍了Java Collections的emptyList、EMPTY_LIST详解与使用说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-11-11
最新评论