我想从一组图像中创建一个视频(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);