Flask接口签名sign原理与实例代码浅析
422
2022-12-13
使用Java和ffmpeg把音频和视频合成视频的操作方法
FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证(依据你选择的组件)。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多codec都是从头开发的。
FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。它包括了目前领先的音/视频编码库libavcodec。 FFmpeg是在linux下开发出来的,但它可以在包括Windows在内的大多数操作系统中编译。这个项目是由Fabrice Bellard发起的,现在由Michael Niedermayer主持。可以轻易地实现多种视频格式之间的相互转换,例如可以将摄录下的视频avi等转成现在视频网站所采用的flv格式
主要功能:
1、视频格式转换功能
ffmpeg视频转换功能。视频格式转换,比如可以将多种视频格式转换为flv格式,可不是视频信号转换 。
ffmpeg可以轻易地实现多种视频格式之间的相互http://转换(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;
/**
*
* 视频中获取音频文件
*
*/
puQRRjuYpmblic 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个完整的视频。体会了递归的强大。
总结
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~