4

カメラからフレームを取得して処理し、フレームを surfaceView に表示し、キャンバスと drawbitmap などを介して SurfaceView に描画するアプリケーションを Android で構築しています。

確認するために、SurfaceViewとBitmapsとCanvasesがそれを行うための最良の方法ですか? 私はスピードを求めています。

上記に対する答えが「はい」であると仮定すると、質問は次のようになります。次の関数をどこに配置する必要がありますか?

camera_object.setPreviewCallback(new PreviewCallback()
     public void onPreviewFrame(byte[] data, Camera camera){

onCreate() に配置する必要がありますか、それとも surfaceCreated() または surfaceChanged() に配置する必要がありますか?

mainactivity クラスを次のように宣言しました。

public class MainActivity extends Activity implements SurfaceHolder.Callback, Camera.PreviewCallback
{

そのクラスで、Eclipse は次のように MainActivity クラスで onpreviewframe のオーバーライド関数を作成するように強制します

public void onPreviewFrame(byte[] data, Camera camera){
}

しかし、呼び出されることはありません。この機能を使ってみるべきですか? 使ったほうがいいですか?それともEclipseのものですか?

お知らせ下さい

4

2 に答える 2

7

アプリから setPreviewDisplay ()startPreview()、およびsetPreviewCallback(this)を呼び出していますか? それがなければ、onPreviewFrame() への呼び出しはありません。実際、SurfaceView を使用している場合、コールバック プレビュー バッファーは、画面に表示されている実際のバッファーのコピーです。したがって、これらのコピーされたバッファを表示したい場合は、新しいビューを作成して上書きする必要があります。これは非効率的です。代わりにSurfaceTextureを使用し、「onFrameAvailable」コールバックを使用してフレームを取得し、手動で描画して表示することをお勧めします。この例は、デフォルトの Android カメラ アプリのPanoramaActivityコードにあります。

于 2012-07-18T23:12:18.570 に答える
1

これがないcamera_object.setPreviewDisplay(surface_holder);と、カメラのコールバックを受信できません。も忘れないで

surface_view.setVisibility(View.VISIBLE);
surface_holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

カメラのプレビューを別のビューで非表示にすることができます。3.0 以降では、サーフェスを画面の外に押し出すこともできます (画面の下部に表示します)。後者のトリックが 2.3.6 で機能するかどうかはわかりません。

于 2012-07-19T14:20:20.557 に答える