28

録画中に表示される実際の画面上のプレビューとは異なるサイズのビデオをユーザーが録画できるようにしようとしています。これは、次のように述べている関数に関するこのドキュメントgetSupportedVideoSizesから可能であるようです。

返されたリストが null でない場合、返されたリストには少なくとも 1 つの Size が含まれ、ビデオ ソースとしてカメラが使用されている場合は、返されたリストのサイズの 1 つをカムコーダー アプリケーションの MediaRecorder.setVideoSize() に渡す必要があります。この場合、プレビューのサイズは、ビデオ録画中に録画されたビデオの解像度と異なる場合があります。

これは、一部の携帯電話がこの fn から null を返すことを示唆しています (私の経験では、Galaxy SIII が返します) が、そうでない場合は、実際のビデオとは異なる解像度でプレビューを提供することができます。この理解は正しいでしょうか?一部の電話は動作を許可し、他の電話は許可しませんか?

解決策を試みる:

ビデオ録画のセットアップの長いプロセスで使用される機能の公式説明では、setPreviewDisplay次のように述べられています。

このメソッドが null サーフェスで呼び出された場合、またはまったく呼び出されなかった場合、メディア レコーダーはカメラのプレビュー サーフェスを変更しません。

これは私が望んでいるように思えますが、残念ながらこれを行うと、ビデオ録画プロセス全体が完全に台無しになります。ビデオを録画する過程で、この関数に null を渡したり、まったく呼び出したりすることはできないと想定しています。おそらく、他のコンテキストではこれで問題ありません。残念ながら、これは私には役に立たないようです。

私の唯一の次のステップは、TextureViewopenGL を使用して実際の解像度とは異なる希望のサイズにテクスチャを引き伸ばす (そして画面から余分な部分をトリミングする) ために、s を調べて、典型的な SurfaceView 実装とは対照的にプレビュー テクスチャを使用することです。 、次に、SurfacesetPreviewDisplayのコンストラクターを使用して関数の Surface をSurface(SurfaceTexture surfaceTexture)構築します。TextureViewICS との互換性がないため、また、かなり複雑になるため、 の使用は避けたいと思います。

これはデリケートなプロセスのように思えますが、誰かがこの分野でアドバイスを提供できることを願っています.

ありがとうございました。

4

3 に答える 3

2

a. ユーザーがビデオ サイズとして x、y のサイズを設定するとします。

b. getSupportedVideoSizes 関数を使用してリスト全体を取得し、x、y がそれらのいずれかに該当するかどうかを確認し、MediaRecorder.setVideoSize() を設定します。x、y が getSupportedVideoSizes リストに該当しない場合は、ビデオのデフォルト プロファイルを設定します。記録。

これはビデオサイズについてです

プレビューサイズになりましたが、回避策はあまりありません。SurfaceView を保持する RelativeLayout を取得します。

<android.view.SurfaceView xmlns:android="http://schemas.android.com/apk/res/android"
 android:id="@+id/preview"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 />

preview は SurfaceView の名前です。ここでは、幅と高さの半分にサイズ変更するサンプルを示します。

resetCamera();  //reset the camera   

ViewGroup.LayoutParams params = preview.getLayoutParams();
RelativeLayout myRelLayout = (RelativeLayout) findViewById(R.id.myRelLayout);
params.width = (int) (myRelLayout.getWidth()/2);
params.height = (int)(myRelLayout.getHeight()/2);
preview.setLayoutParams(params);

initCamera(); //initiate the camera(open camera, set parameter, setPreviewDisplay,startPreview)

プレビューの解像度を見て、ビデオのサイズに応じて高さまたは幅を縮小してください。

それが役に立てば幸い。

于 2013-02-06T11:23:34.913 に答える
1

ご指摘のとおり、これは getSupportedVideoSizes() が null 以外のリストを返す場合にのみ可能です。

ただし、null 以外のリストが表示された場合は、次の単純なアプローチが機能するはずです。

  1. setPreviewSizeで目的のプレビュー解像度を設定します。選択するサイズは、getSupportedPreviewSizesから指定されたサイズの 1 つでなければなりません。

  2. setPreviewDisplay または setPreviewTexture を使用して、プレビュー表示をSurfaceViewまたはSurfaceTextureにそれぞれ設定します。

  3. プレビューを開始します。

  4. メディア レコーダーを作成し、getSupportedVideoSizesのいずれかのサイズを使用してsetVideoSizeで直接ビデオ サイズを設定するか、定義済みのカムコーダー プロファイルのいずれかを使用して、特定の品質/サイズのすべてのメディア レコーダー設定を構成します。

  5. カメラ オブジェクトを MediaRecorder のsetCamera呼び出しに渡し、残りのメディア レコーダーを構成して、録画を開始します。

null 以外の getSupportedVideoSizes リストを持つデバイスでは、setPreviewSize 呼び出しで設定された解像度でプレビューが維持され、設定されたビデオ サイズ/カムコーダー プロファイル解像度で動作する録画が行われます。ビデオ サイズがサポートされていないデバイスでは、プレビュー サイズは MediaRecorder によってリセットされ、記録サイズと一致します。非常に低いプレビュー解像度と高い録画解像度 (たとえば、プレビュー用に 160x120、録画用に 720p) を設定することで、これをテストできるはずです。プレビューの品質が大幅に向上するため、記録の開始時に MediaRecorder がプレビューの解像度を 720p に切り替えるかどうかは明らかです。

プレビュー サイズは、SurfaceView ディスプレイの寸法に直接リンクされていないことに注意してください。カメラ プレビューの出力は、SurfaceView に収まるようにスケーリングされます。そのため、SurfaceView のサイズが、たとえばレイアウトとデバイスのために 100x100 ピクセルである場合、使用するプレビュー解像度が何であれ、表示用に 100x100 にスケーリングされます。そのため、プレビューが歪まないように、SurfaceView の縦横比を正しく維持する必要があります。

また、電力効率のために、SurfaceView の実際のピクセル数よりもはるかに高いプレビュー解像度を使用しないでください。追加された解像度は、プレビューを surfaceview に合わせるときに失われるためです。もちろん、これは getSupportedVideoSizes() が null 以外の値を返す場合にのみ可能です。

于 2013-02-06T20:28:39.317 に答える
0

まず、具体的な質問にお答えします。

  1. 実際のビデオとは異なる解像度のプレビューを提供することができます。この理解は正しいでしょうか?

はい、プレビュー サイズは多くの場合、記録サイズと同じです。プレビュー サイズは、多くの場合、ディスプレイ サイズにリンクされていません。そのため、電話に CIF (352 x 288) のディスプレイがあり、D1 (720 x 480) を記録できる場合、プレビュー サイズと記録サイズは異なります。この点については、他の有識者の方が十分に回答されていると思います。

  1. 一部の電話は動作を許可し、他の電話は許可しませんか?

いくつかのローエンドの携帯電話を除いて、最新の携帯電話のほとんどがこの機能をサポートしています。

とともにsetPreviewDisplay、この点も考慮する必要があります。

1 つの例外は、startPreview() が呼び出される前にプレビュー サーフェスが設定されていない (または null に設定されている) 場合、このメソッドを null 以外のパラメータで 1 回呼び出して、プレビュー サーフェスを設定することができることです。(これにより、カメラのセットアップとサーフェスの作成を並行して行うことができ、時間を節約できます。) プレビュー サーフェスは、プレビューの実行中に変更されない場合があります。

がサーフェスsetPreviewDisplayで呼び出されたときに直面する問題を教えてください。NULL

于 2013-02-10T13:39:26.203 に答える