2

我正在做一个使用保存在 sd 卡中的一组照片创建视频的应用程序。我要解决的问题是当我创建一些视频时应用程序崩溃。崩溃取决于源图片文件的分辨率。例如,我可以使用 400 张分辨率为 320x480 的图像渲染视频,但我只能使用分辨率为 2500x3200 的图像渲染 25 帧视频。

我正在使用 Asynctask 在后台进行渲染过程(用于向用户提供反馈并使其了解渲染过程)。当渲染进程崩溃时,logcat 中不会捕获任何警告/错误/等。使用 DDMS 检查内存使用情况,我看不到任何内存泄漏(我也没有在 logcat 上收到任何内存警告)。出于这个原因,我认为这可能是与 ffmpeg 库相关的问题(但我不知道)。

我在 avcodec.java 上定义了 testet 不同的编解码器,例如:

AV_CODEC_ID_MPEG1VIDEO = 1,
AV_CODEC_ID_MPEG2VIDEO = 2,
      AV_CODEC_ID_H263 = 5,
     AV_CODEC_ID_MJPEG = 8,

ETC

尝试使用无损视频编解码器似乎没有效果,当我尝试使用某些编解码器时,我也会遇到一些错误。

我在索尼爱立信 Xperia Arc(1ghz cpu,320mb 内部内存)上运行我的应用程序。

我不知道我的智能手机是否有足够的能力来渲染长的高清视频,但我看到市场上有一些应用程序,比如Droid Timelapse可以做到这一点。

任何建议将不胜感激,我不知道该如何解决。

谢谢你。

4

1 回答 1

1

好的,最后我找到了解决方案,但不是原来的问题。

为了创建视频,我使用了如下代码:

    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++;
}

使用它,所有问题都消失了,我可以毫无问题地渲染长视频。

于 2013-08-26T18:27:25.430 回答