android - JAVACV在Android上的渲染性能ffmpeg

标签 android video javacv

我正在开发一个应用程序,它使用保存在 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/

相关文章:

java - 变量在函数外丢失了它的值?

java - 当另一个 fragment 的按钮尝试打开它时,时间选择器对话框会使应用程序崩溃

c# - 如何模拟视频捕获设备并提供动态视频内容?

c++ - opencv中的以下方法是什么意思?

java - Android JSONObject 始终返回 "null"

java - 安卓socket连接失败?

c# - 使用 MseStreamSource 播放 MPEG-2 TS

video - 从移动网站直接开始youtube视频播放

android - 无法使用 JavaCV 在 Android 中合并视频 ("Sample Description"错误)

java - 带有 JavaCV 的 OpenCV 或仅 OpenCV 以使用 java API