5

サーフェス ビューでビデオのサイズを変更したい

ビデオ用の Surface ビューとホルダーを使用して、Media Player でビデオを再生しています...

// しかし、Micromax、iball、Akash タブレットなどの一部のデバイスに MediaPlayerControl を実装すると、ACRA バグ追跡によって追跡された抽象メソッドが利用できないというエラーが発生します。

今、私は言及された問題の解決策を持ちたいです:

  • 一部のデバイスのメディア コントローラーと同様に、抽象メソッドが原因でクラッシュすることなく、すべてのデバイスでメディア プレーヤー コントロールをアクティブにする方法。

  • ビデオの表面ビューのサイズを変更するにはどうすればよいですか?

コードは、samsung galaxy gt p1000 OS 2.2および一部の安価なデバイス WorldTeck などで f9 で動作しています。

ただし、Creative ziio 7 OS バージョンは 2.2.1 (480*800) 解像度密度は 160 dpiで、ビデオはズームされているように見え、端から切り取られます。

コードを以下に示します。

/* Media Player Control is commented due to force close in some devices say *micromax,Creative ziio, akash etc */

    public class VideoViewerActivity extends Activity implements
            OnBufferingUpdateListener, OnCompletionListener, OnPreparedListener,
            OnVideoSizeChangedListener, SurfaceHolder.Callback {
        // implements  ERROR in some devices , MediaPlayerControl
        private static final String TAG = "MediaPlayerDemo";
        private int mVideoWidth;
        private int mVideoHeight;
        private MediaPlayer mMediaPlayer;
        private SurfaceView mPreview;
        private SurfaceHolder holder;
        private String path = "";
        private Bundle extras;
        private static final String MEDIA = "media";
        private static final int LOCAL_AUDIO = 1;
        private static final int STREAM_AUDIO = 2;
        private static final int RESOURCES_AUDIO = 3;
        private static final int LOCAL_VIDEO = 4;
        private static final int STREAM_VIDEO = 5;
        private boolean mIsVideoSizeKnown = false;
        private boolean mIsVideoReadyToBePlayed = false;
        /* ERROR In Abstract method implementation in the other devices */
        // private MediaController mediaController;
        private Context context;
        private final Handler handler = new Handler();

        /**
         * 
         * Called when the activity is first created.
         */
        @Override
        public void onCreate(Bundle icicle) {
            super.onCreate(icicle);
            setContentView(R.layout.video_layout);
            context = this;
            path = getIntent().getExtras().getString("media");

            Log.v("arpit", "path " + path);
            mPreview = (SurfaceView) findViewById(R.id.surfaceview1);
            holder = mPreview.getHolder();
            holder.addCallback(this);
            holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
            extras = getIntent().getExtras();

        }

        private void playVideo() {
            doCleanUp();
            try {

                // Create a new media player and set the listeners
                File f = new File(path);
                // FileInputStream in = new FileInputStream(f);

                RandomAccessFile randomAccessFile = new RandomAccessFile(f, "r");
                // randomAccessFile.skipBytes(1024);
                FileDescriptor fileDescriptor = randomAccessFile.getFD();

                mMediaPlayer = new MediaPlayer();
                mMediaPlayer.setDataSource(fileDescriptor, Constant.key1.length
                        + Data.deviceID.length(), f.length());

                mMediaPlayer.setDisplay(holder);
                mMediaPlayer.prepare();
                mMediaPlayer.setOnBufferingUpdateListener(this);
                mMediaPlayer.setOnCompletionListener(this);
                mMediaPlayer.setOnPreparedListener(this);
                mMediaPlayer.setOnVideoSizeChangedListener(this);
                mMediaPlayer.setScreenOnWhilePlaying(true);

                // mediaController = new MediaController(this);
                mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);

            } catch (Exception e) {
                Log.e(TAG, "error: " + e.getMessage(), e);
                Toast.makeText(context, "supported video was not found",
                        Toast.LENGTH_SHORT).show();
                finish();
            }
        }

        public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
            Log.v(TAG, "onVideoSizeChanged called");
            if (width == 0 || height == 0) {
                Log.e(TAG, "invalid video width(" + width + ") or height(" + height
                        + ")");
                return;
            }
            mIsVideoSizeKnown = true;
            mVideoWidth = width;
            mVideoHeight = height;
            if (mIsVideoReadyToBePlayed && mIsVideoSizeKnown) {
                startVideoPlayback();
            }
        }


        public void surfaceDestroyed(SurfaceHolder surfaceholder) {
            Log.d(TAG, "surfaceDestroyed called");
        }

        public void surfaceCreated(SurfaceHolder holder) {
            Log.d(TAG, "surfaceCreated called");
            playVideo();

        }

        private void doCleanUp() {
            mVideoWidth = 0;
            mVideoHeight = 0;
            mIsVideoReadyToBePlayed = false;
            mIsVideoSizeKnown = false;
        }

        private void startVideoPlayback() {
            Log.v(TAG, "startVideoPlayback");
//also tried and used the below line but nothing good 


// holder.setFixedSize(480, 800);

holder.setFixedSize(mVideoWidth, mVideoHeight);

mMediaPlayer.start();

        }


    }
4

2 に答える 2

2

サーフェス ビューの代わりに TextureView を使用し (ビデオを回転させることができます)、次のように setScale{X|Y}() を適切に設定しました。

@Override
public void onVideoSizeChanged(MediaPlayer mp, int w, int h) {
    if (w > 0 && h > 0) {
        RelativeLayout.LayoutParams l;
        DisplayMetrics metrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(metrics);
        l = new RelativeLayout.LayoutParams(metrics.heightPixels, metrics.widthPixels);
        l.addRule(RelativeLayout.CENTER_IN_PARENT, -1);
        float scale = (metrics.heightPixels * 1.0f) / (metrics.widthPixels * 1.0f);
        videoView.setScaleX(scale);
        videoView.setLayoutParams(l);
        Log.d(YourApp.TAG, "video size: " + mp.getVideoWidth() + "x" + mp.getVideoHeight() + " vertical scale: " + scale);
    }
}

ビデオを回転させたことに注意してください。これが、X のスケールを設定する理由です。

于 2013-05-07T11:28:41.683 に答える
1

こんにちはarpit私は、あなたがビデオファイルの再生について言及したのと同じデバイスでも作業していました.ビデオプレーヤーにコントロールを適用しているときに同じ問題が発生しました(抽象的方法は利用できません)。

このトピックに関する私の研究開発によると、カスタマイズされた Android OS とこれらのデバイスのハードウェアは、Samsung デバイスと比較して非常に品質が悪いため、相互に互換性がないという結論に達しました。そのようなデバイスではサポートされていません。

したがって、これらのデバイスでは、そのような問題の解決策はないと思います。

プロジェクトの開発中は、標準デバイスの使用に集中するようにしてください。これはあなたを大いに助けるかもしれません。

ありがとう。:)

于 2012-06-18T10:03:16.237 に答える