9

カメラの PreviewCall back(onPreviewFrame) を通じて MediaCodec を使用して、毎秒 30 フレームのビデオをエンコードしようとしています。エンコードしたビデオは常に非常に高速に再生されます (これは望ましくありません)。そのため、int frameCount 変数を設定してそのカウントを記憶することにより、カメラのプレビューに入るフレーム数を確認しようとしました。カメラのプレビューを 30 fps プレビューに設定しているため (以下に示すように)、私が期待しているのは 30 フレーム/秒です。返される結果は同じではありません。onPreviewFrame コールバックを 10 秒間呼び出しましたが、返される frameCount の数は約 100 フレームしかありません。300 フレームを期待しているので、これは悪いことです。カメラのパラメーターは正しく設定されていますか? これは Android のカメラ プレビュー コールバックの制限ですか? これが Android カメラのプレビュー コールバックの制限である場合、

お読みいただき、helpout にご協力いただきありがとうございます。コメントや意見をいただければ幸いです。

カメラの onPreviewFrame を使用してエンコードされたビデオの例を次に示します。

http://www.youtube.com/watch?v=I1Eg2bvrHLM&feature=youtu.be

                Camera.Parameters parameters = mCamera.getParameters();
                parameters.setPreviewFormat(ImageFormat.NV21);
                parameters.setPictureSize(previewWidth,previewHeight);
                parameters.setPreviewSize(previewWidth, previewHeight);
//              parameters.setPreviewFpsRange(30000,30000);

                parameters.setPreviewFrameRate(30);
                mCamera.setParameters(parameters);

                mCamera.setPreviewCallback(previewCallback);
                mCamera.setPreviewDisplay(holder);
4

1 に答える 1

17

いいえ、Android カメラは、特に 30 FPS での安定したフレーム レートを保証しません。たとえば、低照度条件ではより長い露出を選択する場合があります。

しかし、私たちアプリ開発者が事態を悪化させるいくつかの方法があります。

まず、setPreviewCallback()の代わりに を使用しsetPreviewCallbackWithBuffer()ます。これにより、ガベージ コレクタに不要な負荷がかかる可能性があります。

第 2onPreviewFrame()に、メイン (UI) スレッドに到着した場合、UI アクションによってカメラ フレームの到着が直接遅延されます。onPreviewFrame()別のスレッドを維持するにはopen()、カメラをセカンダリ ルーパー スレッドにする必要があります。ここで、これを実現する方法を詳しく説明しました:他の同様のクラスに対する HandlerThread の最適な使用

3 番目に、処理時間が 20 ミリ秒未満であることを確認します。

于 2013-11-12T08:10:04.177 に答える