avcodec_encode_video2()错误-1:无法对视频数据包进行编码-javacv



我想从一组图像中创建一个视频(mp4),并想在其中添加背景声音。背景声音可以录制,也可以使用android中的内容选择器浏览文件。当以3gp格式录制新音频时,以下代码将创建视频。然而,当我浏览音频文件(例如mp3)时,它会显示此错误,并且录制的视频无法播放。

显示的错误为:

org.bytedeco.javacv.FrameRecorder$Exception: avcodec_encode_video2() error -1: Could not encode video packet. :at video_settings$Generate.doInBackground(video_settings.java:298)

java:298中的代码是

                    recorder.record(frame2);

相关代码为:

protected Void doInBackground(Void... arg0) {

        try {
            FrameGrabber grabber1 = new FFmpegFrameGrabber(paths.get(0));
            FrameGrabber grabber2 = new FFmpegFrameGrabber(backgroundSoundPath);
            Log.d("hgbj", backgroundSoundPath);
            grabber1.start();
            grabber2.start();
            FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(video, 320,
                    240, grabber2.getAudioChannels());// 320, 240
            recorder.setVideoCodec(avcodec.AV_CODEC_ID_MPEG4);//
            recorder.setPixelFormat(avutil.AV_PIX_FMT_YUV420P);
            recorder.setFormat("mp4");
            recorder.setFrameRate(2);
            recorder.setVideoBitrate(10 * 1024 * 1024);
            recorder.start();
            Frame frame1, frame2;
            long timeLength = grabber2.getLengthInTime();
            System.out.println("total time = " + timeLength);

            for (int i = 0; i < paths.size(); i++) {
                // record this frame and then record (numFrames*percentageTime[i]/100) number of frames of the audio.
                frame1 = grabber1.grabFrame();
                long startTime = System.currentTimeMillis();
                recorder.setTimestamp(startTime * 1000);
                recorder.record(frame1);
                boolean first = true;
                // while current time - start time < percentage time * total time / 100: record frame2
                long temp = timeLength * percentageTime[i] / 100000 + startTime;
                while (System.currentTimeMillis() <= temp) {
                    frame2 = grabber2.grabFrame();
                    if (frame2 == null) break;
                    if (first) {
                        recorder.setTimestamp(startTime * 1000);
                        first = false;
                    }
                    recorder.record(frame2);
                }
                if (i < paths.size() - 1) {
                    grabber1.stop();
                    grabber1 = new FFmpegFrameGrabber(paths.get(i + 1));
                    grabber1.start();
                }
            }

我的问题是:如果它适用于3gp录制的文件,为什么它不适用于浏览的mp3文件?我应该怎么做才能使它工作?我尝试过更改编解码器、帧高宽度、视频比特率,但不知道如何确定什么比特率等与给定的编解码器/格式兼容。我正在将从文件浏览器获得的内容uri更改为真实路径,这样就不是问题了。

您可以尝试使用其他视频编解码器。我自己将视频编解码器设置为AV_codec_ID_H264来解决这个问题。所以你可以这样尝试:

recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);

最新更新