jave

更新时间:2023-01-04 03:03:09 阅读: 评论:0


2023年1月4日发(作者:龙门镖局插曲)

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;

privateListcommand;

publicVideoFormatToH264(StringfilePath,StringOutfilePath){

ePath=OutfilePath;

th=filePath;

}

publicVideoFormatToH264(StringfilePath,StringOutfilePath,Listcommand){

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;

privateListcommand;

ChangeVideoTask(Stringpath,StringoutFilePath){

ePath=outFilePath;

th=path;

}

ChangeVideoTask(Stringpath,StringoutFilePath,Listcommand){

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;

}

publicListgetCommand(){

returncommand;

}

publicvoidtCommand(Listcommand){

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小时内删除。

上一篇:易图
下一篇:准确时间
标签:jave
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图