java对视频进⾏转码
这⾥有两个⽅案:
1.利⽤国外⼀个⼤佬写的jar包jave,⾥⾯集成了ffmpeg,⽬前源码应该是更新到1.0.2,看了下源码应该发现,这个功能还是⾮常强⼤
的,如果不需要转码,只需要获取下图⽚,视频信息,更是⽅便==。
JAVE(JavaAudioVideoEncoder),是⼀个包涵项⽬库。开发这可以运⽤它去实现⾳频(Audio)与视频(Video)⽂件的转码。例如你要把
AVI格式⽂件转为MPEG⽂件、WAV格式⽂件转为MP3格式⽂件,同时你还能调整⽂件⼤⼩与⽐例。JAVE兼容和⽀持很多格式之间的转
码……
转码的⽅法:
voidencode(urce,
rget,
ngAttributesattributes)
lArgumentException,
ormatException,
rException
urce=newFile("");
rget=newFile("4");
3.
ttributesaudio=newAudioAttributes();
ec("libmp3lame");
Rate(newInteger(56000));
nnels(newInteger(1));
plingRate(newInteger(22050));
9.
ttributesvideo=newVideoAttributes();
ec("libx264");
12.
ngAttributesattrs=newEncodingAttributes();
mat("mp4");//h264编码
ioAttributes(audio);
eoAttributes(video);
rencoder=newEncoder();
(source,target,attrs);
借鉴的这篇博客:/qllinhongyu/article/details/29817297⾥⾯介绍jave更详细点
2.利⽤ffmpeg进⾏转码,有坏处:
windows服务器还⽐较简单,直接下载ffmpeg可以直接进⾏转码了,但是linux服务器的ffmpeg的安装真的挺⿇烦的。。我⽤了3个
⼩时装好。
需要调⽤java执⾏外部程序Runtime类或者ProcessBuilder去构建Process,据说调⽤多了,⾮常损耗性能。
1
2
Runtimeruntime=time();
Processp=(cmd);
Processp=newProcessBuilder(cmd).start();
这⾥有⼀点需要注意,runtime执⾏执⾏命令,processBuilder需要具体的⽂件
runtime的cmd:Stringcopy="cp-rf"+source+""+target;
processBuilder的cmd:这⾥读的是配置⽂件中的
=/usr/local/ffmpegRedHat/bin/./ffmpeg
=D:
开头不太⼀样。。
我⽬前直接⽤的ffmpeg,这⾥粘⼀下我的源码,可以做⼀下参考
@Override
publicbooleanstartChangeToH264(StringinputPath,StringoutPath)throwsException{
//ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)
if(!checkfile(inputPath)){
n(inputPath+"isnotfile");
thrownewException("⽂件不存在");
}
if(checkContentType(inputPath)!=0){
thrownewException("⽂件类型⽆法解析");
}
VideoFormatToH264videoFormatToH264=newVideoFormatToH264(inputPath,outPath);
();
returntrue;
}
privatestaticbooleancheckfile(Stringpath){
Filefile=newFile(path);
if(!()||(!())){
returnfal;
}
returntrue;
}
privatestaticintcheckContentType(StringinputPath){
Stringtype=ing(dexOf(".")+1,())
.toLowerCa();
//ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)
if(("avi")){
return0;
}elif(("mpg")){
return0;
}elif(("wmv")){
return0;
}elif(("3gp")){
return0;
}elif(("mov")){
return0;
}elif(("mp4")){
return0;
}elif(("asf")){
return0;
}elif(("asx")){
return0;
}elif(("flv")){
return0;
}
//对ffmpeg⽆法解析的⽂件格式(wmv9,rm,rmvb等),
//可以先⽤别的⼯具(mencoder)转换为avi(ffmpeg能解析的)格式.
elif(("wmv9")){
return1;
}elif(("rm")){
return1;
}elif(("rmvb")){
return1;
}
return9;
}
/**
*Createdbyzhangluyaoon2018/6/12.
*/
publicclassVideoFormatToH264{
publicclassVideoFormatToH264{
privateStringfilePath;
privateStringOutfilePath;
privateList
publicVideoFormatToH264(StringfilePath,StringOutfilePath){
ePath=OutfilePath;
th=filePath;
}
publicVideoFormatToH264(StringfilePath,StringOutfilePath,List
ePath=OutfilePath;
th=filePath;
d=command;
}
publicvoidrun(){
ThreadPoolTaskExecutorthreadPoolTaskExecutor=(ThreadPoolTaskExecutor)n("threadPoolTaskExecutor");
ChangeVideoTaskchangeVideoTask=newChangeVideoTask(ePath(),filePath());
e(changeVideoTask);
}
publicvoidrunCommand()throwsException{
if(d!=null){
ThreadPoolTaskExecutorthreadPoolTaskExecutor=(ThreadPoolTaskExecutor)n("threadPoolTaskExecutor");
ChangeVideoTaskchangeVideoTask=newChangeVideoTask(ePath(),filePath(),d);
e(changeVideoTask);
}el{
("command为空");
thrownewException("command为空");
}
}
privateclassChangeVideoTaskimplementsRunnable{
privateStringfilePath;
privateStringoutFilePath;
privateList
ChangeVideoTask(Stringpath,StringoutFilePath){
ePath=outFilePath;
th=path;
}
ChangeVideoTask(Stringpath,StringoutFilePath,List
ePath=outFilePath;
th=path;
d=command;
}
@Override
publicvoidrun(){
try{
//命令是空时,执⾏视频转换成H264
if(y(command)){
command=newArrayList
(PEGPath());
("-i");
(filePath);
("-y");
("-vcodec");
("h264");
("-pret");
("ultrafast");
("-profile:v");
("baline");
("-acodec");
("aac");
("-strict");
("experimental");
("-s");
("640*480");
("-b");
("568k");
("568k");
("-ab");
("128k");
if(perty("").toLowerCa().indexOf("windows")>-1){
(ing(1));
}el{
(outFilePath);
}
}
n("开始转换");
ProcessvideoProcess=newProcessBuilder(command).redirectErrorStream(true).start();
newPrintStream(orStream()).start();
newPrintStream(utStream()).start();
r();//等待进程结束
CacheServicecacheService=(CacheService)n("cacheService");
StringsourceName=ing(dexOf("/")+1);
//转换成功,去掉redis中的key
(sourceName);
n("转换成功");
e(filePath);
}catch(Exceptione){
tackTrace();
}
}
}
privateclassPrintStreamextendsThread
{
tream__is=null;
publicPrintStream(treamis)
{
__is=is;
}
publicvoidrun()
{
try
{
while(this!=null)
{
int_ch=__();
if(_ch!=-1)
((char)_ch);
elbreak;
}
}
catch(Exceptione)
{
tackTrace();
}
}
}
publicStringgetFilePath(){
returnfilePath;
}
publicvoidtFilePath(StringfilePath){
th=filePath;
}
}
publicStringgetOutfilePath(){
returnOutfilePath;
}
publicvoidtOutfilePath(StringoutfilePath){
OutfilePath=outfilePath;
}
publicList
returncommand;
}
publicvoidtCommand(List
d=command;
}
加点东西。
ffmpeg转换成mp4⽂件以后,视频的元数据在末尾,jwplayer播放的时候需要全部缓冲结束才能开始播放,⽤户体验及其的不好~~更改
后的代码先不贴上来了,就说下⽅法。
ffmpeg⽂件夹中,编译前的⽂件夹,tools下⾯有⼀个qt-faststart.c
执⾏下makeqt-faststart会⽣成⼀个qt-faststart命令
然后代码中对⽂件再执⾏⼀下qt-faststartinputPathoutPath命令就可以了
会⽣成⼀个新的⽂件,这个⽂件的元数据在开头,可以直接播放的~~~
本文发布于:2023-01-04 03:03:09,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/90/88211.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |