Android Javacv FFMpeg在视频上覆盖动画gif

时间:2019-04-05 18:21:10

标签: android video ffmpeg overlap javacv

我正在开发一个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;
}

0 个答案:

没有答案