Java利用Javacv对视频进行淡入淡出处理

该文转自 烂代码网:

https://trashcode.cn/post/d/b340ddfb-6aeb-467c-8cd2-e868a2ac731a

我们通过Javacv中FFmpeg音视频处理包,对视频进行淡入淡出处理。
其中用到了FFmpeg中的处理视频淡入淡出的fade filter
该filter命令如下:

  • 在开始30秒淡入:
fade=in:0:30

该命令等同于:

fade=t=in:s=0:n=30
  • 在总帧数为200帧的视频中,从第155帧开始,淡出最后的45帧
fade=out:155:45
fade=type=out:start_frame=155:nb_frames=45

更多该命令的定义,可以参见文档
https://ffmpeg.org/ffmpeg-filters.html#fade
所以,在Javacv中,我们可以用把包裹了FFmpeg filter的FFmpegFrameFilter类直接对视频进行淡入淡出处理
处理流程为:
1.从样例中获取视频帧
2.将视频帧放入filter中进行淡入淡出处理
3.从filter中将处理好的帧放入recorder中生成淡入淡出视频
代码如下:

//fadeFilter为FFmpeg提供的淡出淡出命令,比如"fade=in:0:150:color=red,fade=out:850:150"
public void fadeVideo(String fadeFilter)
{
  //样例视频文件
String audioOne = ="bjdoggy.mp4";
//生成的淡入淡出效果的文件
String fadeAudio="fadeVideo.mp4";

try{
//加载样例视频
FFmpegFrameGrabber grabberOne = FFmpegFrameGrabber.createDefault(audioOne);
grabberOne.start();

//创建记录淡入淡出视频的recorder
FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(fadeAudio,grabberOne.getImageWidth(),
grabberOne.getImageHeight());
recorder.setVideoCodec(avcodec.AV_CODEC_ID_MPEG4);
recorder.setFormat("mp4");
recorder.setFrameRate(grabberOne.getFrameRate());
recorder.setPixelFormat(avutil.AV_PIX_FMT_YUV420P);
//开始记录
recorder.start();

//创建淡入淡出的filter
FFmpegFrameFilter filter=new FFmpegFrameFilter(fadeFilter,grabberOne.getImageWidth(),
grabberOne.getImageHeight());
filter.setFrameRate(grabberOne.getFrameRate());
filter.setPixelFormat(avutil.AV_PIX_FMT_YUV420P);
filter.start();

Frame fOne,recordF;
while(true)
{
//获取样例视频帧
fOne=grabberOne.grabFrame();
if(fOne==null)
break;
if (fOne != null) {
//放入filter
filter.push(0, fOne);
}
}
//从filter中取出处理好的帧,并放入recorder中
while((recordF=filter.pull())!=null)
{
recorder.record(recordF);
}
grabberOne.stop();
filter.close();
recorder.close();
LOGGER.info(fadeAudio);
}
catch(Exception e)
{
LOGGER.error("",e);
}
}

 

posted @ 2020-11-01 11:34  火眼Tech  阅读(827)  评论(0)    收藏  举报