使用Java和ffmpeg把音频和视频合成视频的操作方法

 更新时间:2020年03月01日 11:35:43   作者:nullBurger  
这篇文章主要介绍了使用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合成视频

需求:在小破站上下载了一些视频,但是放到电脑里面看,我擦,声音文件和视频文件是分开的。

  1. 正确安装ffmpeg并配置好环境变量。
  2. 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类简单用法,结合具体实例形式分析了Java使用String类实现字符串的输出和比较功能相关操作技巧,需要的朋友可以参考下
    2019-07-07
  • Java Eclipse中实现快速替换变量

    Java Eclipse中实现快速替换变量

    这篇文章主要介绍了Java Eclipse中实现快速替换变量,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • Java Collections的emptyList、EMPTY_LIST详解与使用说明

    Java Collections的emptyList、EMPTY_LIST详解与使用说明

    这篇文章主要介绍了Java Collections的emptyList、EMPTY_LIST详解与使用说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • java实现字符串的全排列

    java实现字符串的全排列

    这篇文章主要为大家详细介绍了java实现字符串的全排列,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • Java Method类及invoke方法原理解析

    Java Method类及invoke方法原理解析

    这篇文章主要介绍了Java Method类及invoke方法原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • Mybatis如何自动生成sql语句

    Mybatis如何自动生成sql语句

    这篇文章主要介绍了Mybatis如何自动生成sql语句,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • 一文探究ArrayBlockQueue函数及应用场景

    一文探究ArrayBlockQueue函数及应用场景

    这篇文章主要为大家介绍了一文探究ArrayBlockQueue函数及应用场景,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • Hutool开发MapUtil工具类使用示例

    Hutool开发MapUtil工具类使用示例

    这篇文章主要为大家介绍了Hutool开发MapUtil工具类使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • 关于Java创建线程的2种方式以及对比

    关于Java创建线程的2种方式以及对比

    这篇文章主要给大家介绍了关于Java创建线程的2种方式以及对比的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-01-01
  • Redis作为缓存应用的情形详细分析

    Redis作为缓存应用的情形详细分析

    实际开发中缓存处理是必须的,不可能我们每次客户端去请求一次服务器,服务器每次都要去数据库中进行查找,为什么要使用缓存?说到底是为了提高系统的运行速度
    2023-01-01

最新评论