该文转自 烂代码网:
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 voidfadeVideo(String fadeFilter)
{//样例视频文件
String audioOne = ="bjdoggy.mp4";//生成的淡入淡出效果的文件
String fadeAudio="fadeVideo.mp4";try{//加载样例视频
FFmpegFrameGrabber grabberOne =FFmpegFrameGrabber.createDefault(audioOne);
grabberOne.start();//创建记录淡入淡出视频的recorder
FFmpegFrameRecorder recorder = newFFmpegFrameRecorder(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=newFFmpegFrameFilter(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);
}
}