我正在开发一个Android应用程序,该程序使用javacv和FFMpeg创建视频(从图像加上mp3文件),并且视频生成部分运行良好,但是现在出现了问题,因为我想重叠透明背景动画中的gif动画,我真的很喜欢它,到目前为止,每次尝试都没有成功。
说实话,这是我第一次使用javacv和FFMpeg,因此我对如何使用过滤器一无所知。
我将在下面粘贴完整的视频创建方法,让我们看看是否有人可以帮助我。同样,我的问题是重叠了gif动画,正在创建视频(删除滤镜部分)。我最多能实现的是在视频的左上角重叠一个静态(一帧)的小gif(不透明),但是我想要实现的是一个透明gif,其上具有相同的视频尺寸
也许您会看到废话代码,但是请记住,这是由于我对javacv和FFMpeg过滤器缺乏了解。
我希望任何人都能帮助我。
谢谢。
PS。我已经阅读了这篇文章:javaCV Android, Strange colors on overlay while streaming to rtmp server
@ schw4ndi的,但我却无能为力。
static String recordVideo(JSONObject objJSON) {
try {
fileName = objJSON.has("file_name") ? String.valueOf(objJSON.getString("file_name")) : "";
videoPath = objJSON.has("video_path") ? String.valueOf(objJSON.getString("video_path")) : "";
} catch (JSONException e) {
ExceptionHandler.logException(e);
}
String strReturn = Enum.Result.OK;
if (!fileName.equals("") && !videoPath.equals("")) {
try {
String outputFilename = videoPath + "/" + fileName;
//video grabber
FrameGrabber grabber1 = new FFmpegFrameGrabber(outputFilename + ".jpg");
//audio grabber
FrameGrabber grabber2 = new FFmpegFrameGrabber(outputFilename + ".mp3");
grabber1.start();
grabber2.start();
FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(outputFilename + ".mp4", 1080, 1920,2);
//video
recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);
recorder.setVideoOption("tune", "zerolatency");
recorder.setFrameRate(30);
recorder.setVideoBitrate(128000);
recorder.setVideoOption("crf", "28");
recorder.setVideoQuality(0); //highest quality
recorder.setVideoOption("preset", "fast");
recorder.setFormat("mp4");
//audio
recorder.setAudioCodec(avcodec.AV_CODEC_ID_AAC);
recorder.setSampleRate(44100);
recorder.setAudioBitrate(128000);
recorder.setAudioOption("crf", "0"); //no variable bitrate audio (constant rate factor)
recorder.setAudioQuality(0); //highest quality
FFmpegFrameFilter filter = null;
try{
filter = new FFmpegFrameFilter("movie=" + videoPath + "/anim01.gif [logo];[in][logo]overlay=0:0:format=yuv420 [out]",1080, 1920);
filter.start();
}catch (FrameFilter.Exception e){
e.printStackTrace();
}
recorder.start();
Frame frame1, frame2 = null, frame3 = null;
while ((frame1 = grabber1.grabFrame()) != null ||
(frame2 = grabber2.grabFrame()) != null) {
if (frame1 != null) filter.push(frame1);
frame3 = filter.pull();
//recorder.record(frame1);
recorder.record(frame3, avutil.AV_PIX_FMT_YUV420P);
recorder.record(frame2, avutil.AV_PIX_FMT_YUV420P);
}
recorder.stop();
grabber1.stop();
grabber2.stop();
filter.stop();
} catch (Exception e) {
strReturn = Enum.Result.KO;
ExceptionHandler.logException(e);
}
}
return strReturn;
}