2

SDカードに保存された一連の写真を使用してビデオを作成するアプリケーションを実行しています。私が修正しようとしている問題は、いくつかのビデオを作成するとアプリケーションがクラッシュすることです。クラッシュは、ソース画像ファイルの解像度によって異なります。たとえば、解像度 320x480 の 400 枚の画像を使用してビデオをレンダリングできますが、解像度 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 (1 GHz CPU、320 MB インターン メモリ) でアプリケーションを実行しています。

私のスマートフォンが長い HD ビデオをレンダリングするのに十分な能力を持っているかどうかはわかりませんが、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 に答える