我正在开发一个应用程序,它使用保存在 SD 卡中的一组照片创建视频。我试图解决的问题是当我创建一些视频时应用程序崩溃了。崩溃取决于源图片文件的分辨率。例如,我可以使用 400 张分辨率为 320x480 的图像渲染一个视频,但我只能使用分辨率为 2500x3200 的图像渲染一个 25 帧的视频。
我正在使用 Asynctask 在后台执行渲染过程(用于向用户提供反馈并使其了解渲染过程)。当渲染进程崩溃时,logcat 中不会捕获任何警告/错误/等。使用 DDMS 检查内存使用情况我无法查看任何内存泄漏(我也没有在 logcat 上收到任何内存警告)。由于这个原因,我认为这可能是与 ffmpeg 库相关的问题(但我不知道)。
我测试了在 avcodec.java 上定义的不同编解码器,例如:
AV_CODEC_ID_MPEG1VIDEO = 1,
AV_CODEC_ID_MPEG2VIDEO = 2,
AV_CODEC_ID_H263 = 5,
AV_CODEC_ID_MJPEG = 8,
等等
尝试使用无损视频编解码器似乎没有效果,并且在尝试使用某些编解码器时也会出现一些错误。
我在 Sony Ericsson Xperia Arc(1ghz cpu,320mb 内存)上运行我的应用程序。
我不知道我的智能手机是否有足够的能力来呈现长的高清视频,但我看到市场上有一些应用程序,例如 Droid Timelapse可以做到。
如有任何建议,我将不胜感激,我不知道该如何解决。
谢谢。
最佳答案
好吧,我终于找到了解决方案,但不是原始问题。
为了创建视频,我使用了如下代码:
FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(name,width,heigth);
recorder.start()
while(imagesinfolder){
IplImage img = highgui.cvLoadImage("/path/to/image[i].jpg")
recorder.record(img)
i++;
}
这似乎造成了内存问题,可能是因为 IplImage 没有被垃圾收集器清理。
我的解决方案是使用以下方法代替 highgui.cvLoadImage:opencv_core.cvLoadImage(img);然后,opencv_core.cvReleaseImage(img);在每次迭代中。
FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(name,width,heigth);
recorder.start()
while(imagesinfolder){
IplImage img = opencv_core.cvLoadImage("/path/to/image[i].jpg")
recorder.record(img)
img.cvReleaseImage();
i++;
}
使用它,所有问题都消失了,我可以毫无问题地渲染长视频。
关于android - JAVACV在Android上的渲染性能ffmpeg,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18406384/