在android中使用FFmpegFrameGrabber和FrameRecorder JavaCv创建的视频中没有捕获声音
我正在尝试在android中使用JavaCV对视频文件应用灰度效果。一切正常,但输出文件中没有音频。下面是代码。请帮忙在android中使用FFmpegFrameGrabber和FrameRecorder JavaCv创建的视频中没有捕获声音,android,opencv,ffmpeg,video-processing,javacv,Android,Opencv,Ffmpeg,Video Processing,Javacv,我正在尝试在android中使用JavaCV对视频文件应用灰度效果。一切正常,但输出文件中没有音频。下面是代码。请帮忙 File file = new File(Environment.getExternalStorageDirectory() + File.separator + "test3.mp4"); FFmpegFrameGrabber frameGrabber = new FFmpegFrameGrabber(file.getAbsolutePath());
File file = new File(Environment.getExternalStorageDirectory() + File.separator + "test3.mp4");
FFmpegFrameGrabber frameGrabber = new FFmpegFrameGrabber(file.getAbsolutePath());
FrameRecorder recorder = null;
Log.d("bharat", " Audio channels = " + frameGrabber.getAudioChannels()); // THIS IS RETurnING 0 and not 2
recorder = new FFmpegFrameRecorder("/mnt/sdcard/streaml_t.mp4", 270, 480, frameGrabber.getAudioChannels());
recorder.setVideoCodec(AV_CODEC_ID_H264);
recorder.setFormat("mp4");
recorder.setFrameRate(frameGrabber.getFrameRate());
recorder.setSampleFormat(frameGrabber.getSampleFormat());
recorder.setSampleRate(frameGrabber.getSampleRate());
try {
recorder.start();
frameGrabber.start();
int count = 0;
while (true) {
try {
Frame grabFrame = frameGrabber.grabFrame();
Log.d("bharat:", "frame " + count++);
if (grabFrame == null) {
System.out.println("!!! Failed cvQueryFrame");
break;
}
IplImage frame_copy = cvCreateImage(cvSize(grabFrame.image.width(), grabFrame.image.height()), IPL_DEPTH_8U, 1);
cvCvtColor(grabFrame.image, frame_copy, CV_RGB2GRAY);
grabFrame.image = frame_copy;
recorder.setTimestamp(frameGrabber.getTimestamp());
recorder.record(grabFrame);
} catch (Exception e) {
e.printStackTrace();
}
}
Log.d("bharat:", "frame done");
recorder.stop();
recorder.release();
} catch (Exception e) {
e.printStackTrace();
}
}
注意:我发现frameGrabber.getAudioChannel()返回0而不是2(如果有帮助的话)一旦我发现问题,因为JavaCV中缺少文档,比如:
/** Grab next videoframe */
public IplImage grab()
/** Grab next video or audio frame */
public Frame grabFrame()
所以你们得到音频或视频帧,然后你们总是试图把它处理成图像。您应该先检查是音频还是视频帧,不要尝试调用CVTColor()获取音频。谢谢@Vit Shiryaev,但我已经得到了答案。我实际上使用的是javaCV 0.7,但它不起作用。然后,我更新到javaCV 0.9,它现在可以工作了。谢谢