Java 使用 FFmpeg 处理视频文件示例代码详解
目前在公司做一个小东西,里面用到了FFmpeg简单处理音视频,感觉功能特别强大,在做之前我写了一个小例子,现在记录一下分享给大家,希望大家遇到这个问题知道解决方案。
FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的。
FFmpeg在Linux平台下开发,但它同样也可以在其它操作系统环境中编译运行,包括Windows、MacOSX等。这个项目最早由FabriceBellard发起,2004年至2015年间由MichaelNiedermayer主要负责维护。许多FFmpeg的开发人员都来自MPlayer项目,而且当前FFmpeg也是放在MPlayer项目组的服务器上。项目的名称来自MPEG视频编码标准,前面的"FF"代表"FastForward"。
首先说明,我是在https://ffmpeg.zeranoe.com/builds/这个地方下载的软件,Windows和Mac解压之后即可使用。具体代码如下:
packagecn.bridgeli.demo; importorg.junit.Test; importjava.io.BufferedReader; importjava.io.IOException; importjava.io.InputStream; importjava.io.InputStreamReader; /** *@authorBridgeLi *@date2020/2/2915:40 */ publicclassFfmpegTest{ privatestaticfinalStringOS=System.getProperty("os.name").toLowerCase(); privatestaticfinalStringFFMPEG_PATH="/Users/bridgeli/ffmpeg-20200216-8578433-macos64-static/bin/ffmpeg"; @Test publicvoidtestFfmpeg(){ StringinputWavFile="/Users/bridgeli/inputWavFile.wav"; StringinputMp3File="/Users/bridgeli/inputMp3File.mp3"; StringinputMp4File="/Users/bridgeli/inputMp4File.mp4"; StringoutMergeMp3File="/Users/bridgeli/outMergeMp3File.mp3"; StringoutMergeMp3AndMp4File="/Users/bridgeli/outMergeMp3AndMp4File.mp4"; StringoutConcatMp3File="/Users/bridgeli/outConcatMp3File.mp3"; //拼接 Stringcommand=null; if(OS.contains("mac")||OS.contains("linux")){ command=FFMPEG_PATH+"-i"+inputMp3File+"-i"+inputWavFile+"-filter_complex[0:0][1:0]concat=n=2:v=0:a=1[a]-map[a]"+outConcatMp3File; }elseif(OS.contains("windows")){ command=FFMPEG_PATH+"-i"+inputMp3File+"-i"+inputWavFile+"-filter_complex\"[0:0][1:0]concat=n=2:v=0:a=1[a]\"-map\"[a]\""+outConcatMp3File; } //合并(视频和音频) //Stringcommand=FFMPEG_PATH+"-i"+inputMp4File+"-i"+outConcatMp3File+"-c:vcopy-c:aaac-strictexperimental"+outMergeMp3AndMp4File; //合并 //Stringcommand=FFMPEG_PATH+"-i"+inputMp3File+"-i"+inputWavFile+"-filter_complexamerge-ac2-c:alibmp3lame-q:a4"+outMergeMp3File; System.out.println(command); Processprocess=null; try{ process=Runtime.getRuntime().exec(command); }catch(IOExceptione){ e.printStackTrace(); } if(null==process){ return; } try{ process.waitFor(); }catch(InterruptedExceptione){ e.printStackTrace(); } try(InputStreamerrorStream=process.getErrorStream(); InputStreamReaderinputStreamReader=newInputStreamReader(errorStream); BufferedReaderbr=newBufferedReader(inputStreamReader)){ Stringline=null; StringBuffercontext=newStringBuffer(); while((line=br.readLine())!=null){ context.append(line); } System.out.println("errormessage:"+context); }catch(IOExceptione){ e.printStackTrace(); } process.destroy(); } }
在我的认知中,完成任务是第一位的,所以按照这个简单处理一下音视频是没有问题的,具体更强大的语法,大家可以自己查询相关文档,也可以参考https://www.nhooo.com/article/181662.htm这篇文中,其中我个人也在学习中。下面说两个在使用的过程中遇到的问题。
1.我在测试的时候,DOS和bash都没有问题,但是Java一调用就出错,仔细看报错信息都是什么参数无效之类的,后面参考https://www.nhooo.com/article/181668.htm这篇文章,原来都是一些单双引号和空格什么之类的导致的,大家在用的时候可以注意下,也多看看报错信息。
2.因为我是从上面的文中提到的网址中直接下载解压使用的,但是在部署测试环境的时候是让运维帮忙部署的,因为上面也没有运维直接使用的可执行文件,所以个人猜测运维是直接源码安装的,所以在使用的过程过中遇到了一个问题,没有安装mp3编码库导致的,具体参考https://www.nhooo.com/article/181671.htm这篇文章解决,所以大家在安装好环境之后可以先自己试着直接执行一下命令看看是否成功。
总结
到此这篇关于Java使用FFmpeg处理视频文件示例代码详解的文章就介绍到这了,更多相关javaFFmpeg处理视频文件内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。