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); } }

浙公网安备 33010602011771号