我想从一组图像中创建一个视频(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)
video_settings.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更改为真实路径,这不是问题。
答案 0 :(得分:0)
您可以尝试使用其他视频编解码器。 我自己将视频编解码器设置为AV_CODEC_ID_H264来解决问题。 所以你可以尝试这样:
recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);