3

FRONT CAMERA から Samsung Galaxy S4 (1080wx1920h) のビデオを録画します。結果のビデオは 90° 回転し、上下が逆になります。(写真参照)

ビデオ結果

次に、ビデオ (最終解像度 320wx240h) を取得し、次のように TextureView に表示します。

textureView.setRotation(90.0f);
textureView.setScaleX(-1);

textureView のレイアウト パラメータを次のように設定します。

ViewGroup.LayoutParams params = textureView.getLayoutParams();
params.height = 1440;
params.width = 1080;
textureView.setLayoutParams(params);

結果は次のようになります。

幅1080×高さ1440

何度か再試行した後、レイアウトを次のように設定すると、次のことがわかりました。

params.height = 810;
params.width = 1080;

寸法比率は正しいままです。

810yx1080h

最後に、RecordingActivity (1080wx1440h) に記録されたとおりにビデオを表示したいと思います。

記録解像度

これを達成する方法について何か考えはありますか?

または、フロントカメラからのビデオを正しい回転で記録する方法はありますか?

完全なアクティビティ コード:

import android.app.Activity;
import android.graphics.Point;
import android.graphics.SurfaceTexture;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.Display;
import android.view.Menu;
import android.view.MenuItem;
import android.view.Surface;
import android.view.TextureView;
import android.view.ViewGroup;

public class ReplayActivity extends Activity  implements TextureView.SurfaceTextureListener {
    private String pathToVideo;
    private TextureView textureView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_replay);
        textureView = (TextureView)findViewById(R.id.texture_view);
        textureView.setSurfaceTextureListener(this);
        textureView.setRotation(90.0f);
        textureView.setScaleX(-1);
        pathToVideo = getIntent().getStringExtra("path");
    }

    @Override
    public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
        MediaPlayer mediaPlayer = new MediaPlayer();
        mediaPlayer.setSurface(new Surface(surface));

        try {
            mediaPlayer.setDataSource(pathToVideo);

            mediaPlayer.prepare();

            Display display = getWindowManager().getDefaultDisplay();
            Point size = new Point();
            display.getSize(size);//x = 1080, y = 1920

            Point videoDimensions = new Point(mediaPlayer.getVideoWidth(),mediaPlayer.getVideoHeight());//x = 320, y = 240
            Point resultParams = VideoHelpers.getScaledDimension(new Point(videoDimensions.y * 1000, videoDimensions.x * 1000), size);//x = 1080, y = 1440
            ViewGroup.LayoutParams params = textureView.getLayoutParams();
            params.height = resultParams.y;//1440
            params.width = resultParams.x;//1080
            textureView.setLayoutParams(params);
            mediaPlayer.start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    @Override
    public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) {return false;}
    @Override
    public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int width, int height) {}
    @Override
    public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) {}
}

XML:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#FF0000">
    <TextureView
        android:id="@+id/texture_view"
        android:layout_width="wrap_content"
        android:background="#000000"
        android:layout_height="wrap_content" />
</RelativeLayout>
4

1 に答える 1

0

カメラ、プレビュー、テクスチャ、およびマトリックスを操作するのは難しい場合があります。

カメラの自然な向きは横向きであるため、他に何もしなければ、結果のビデオはその向きになることに注意してください。また、プレビュー フレームは横になります。

textureView.setRotation(90.0f);テクスチャの内部変換マトリックスのみを変更すると、内部に何かtextureView.setScaleX(-1);が描画されると変換が発生し、表示される内容が実際のコンテンツとは異なります。これは問題ありませんが、実際にはカメラはこの回転について何も認識しておらず、メディアレコーダーも認識していません。

Mediarecorderを使用している場合は、以下をご覧ください。

MediaRecorder.html#setOrientationHint(int)

出力ビデオ再生の向きのヒントを設定します。このメソッドは、prepare() の前に呼び出す必要があります。このメソッドは、ビデオ録画中にソース ビデオ フレームの回転をトリガーしませんが、出力形式が OutputFormat.THREE_GPP または OutputFormat.MPEG_4 の場合、出力ビデオに回転角度を含む構成マトリックスを追加して、ビデオ プレーヤーが適切なフレームを選択できるようにします。再生の向き。一部のビデオ プレーヤーは、再生中にビデオの構成マトリックスを無視することを選択する場合があることに注意してください。

パラメーター

時計回りに回転する角度を度単位で指定します。サポートされている角度は、0、90、180、および 270 度です。

他の録音方法を使用している場合は、おそらく以下を参照してください。

Camera.Parameters.html#setRotation(int)

また

Camera.html#setDisplayOrientation(int)

于 2014-10-15T19:17:55.323 に答える