0

VideoView で MediaPlayer を使用して動画を再生しようとしています。残念ながら、オーディオのみが再生されます。ビデオが表示されていません。私のビデオは誰でも読めない保護された場所にあり (そして、再生する前にコピーするには大きすぎます)、ストリーミングする必要があるため、Mediaplayer を使用する必要があります。

(ビデオは問題なく、再生できます。Acer A210 などの Android タブレットでは、非世界的に読み取り可能なファイルにはそれほど敏感ではありません。VideoViews setVideoURI メソッドを使用してビデオを直接再生できます。サムスン タブレットなどでビデオを再生するには、次のコードが必要です。 )

誰かが私が間違っていることを教えてもらえますか? 事前にThx。

public class VideoPlayer extends Activity implements SurfaceHolder.Callback {
private VideoView objVideoView;

@Override
public void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);       
    this.setContentView(R.layout.activity_videoplayer);
    objVideoView = (VideoView) findViewById(R.id.myVideoView); 

    String strVideoNames = "";

    if (savedInstanceState == null) {
        Bundle extras = getIntent().getExtras();
        if(extras != null) strVideoNames = extras.getString("strVideoNames");
    } else {
        strVideoNames = (String) savedInstanceState.getSerializable("strVideoNames");
    }

    playVideo(getVideoUrl(strVideoNames));
}

ArrayList<String> listVideoNames;

public void playVideo(String strVideoNames) {

    if (strVideoNames.contains(";")) {          
        String[] strAVideoUrls = strVideoNames.split(";");
        listVideoNames = new ArrayList<String>(Arrays.asList(strAVideoUrls));           
    } else {
        listVideoNames = new ArrayList<String>();
        listVideoNames.add(strVideoNames);
    }

    playVideoWithMediaPlayer();

}

MediaPlayer objMediaPlayer;

public void playVideoWithMediaPlayer() {

    if (listVideoNames.size() > 0) {        
        try {           
            SurfaceHolder objSurfaceHolder = objVideoView.getHolder();

            objSurfaceHolder.addCallback(this);
            objSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

            objMediaPlayer = new MediaPlayer();
        } catch (Exception e) { 
            alert(e.getMessage()); 
        }
    }
}

public void surfaceCreated(SurfaceHolder holder) {

    try {       
        File fileVideo = new File(getVideoUrl(listVideoNames.get(0)));
        FileInputStream instreamVideo = new FileInputStream(fileVideo);
        objMediaPlayer.setDataSource(instreamVideo.getFD());

        objMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            public void onCompletion(MediaPlayer _objMediaPlayer) {
                listVideoNames.remove(0);   
                if (listVideoNames.size() > 0) {
                    playVideoWithMediaPlayer(); 
                } else {
                    _objMediaPlayer.release();
                }
            }
        });

        objMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
            public void onPrepared(MediaPlayer _objMediaPlayer) {
                Log.d("MediaPlayer","Prepared ...");
                objMediaPlayer.start();
            }
        }); 

        objMediaPlayer.prepare();

    } catch (Exception e) { 
        alert(e.getMessage()); 
    }
}

public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}
public void surfaceDestroyed(SurfaceHolder holder) { objMediaPlayer.stop(); }
}
4

2 に答える 2

12

使用してみてください:

objVideoView.setZOrderMediaOverlay(true);
objVideoView.videoView.setZOrderOnTop(true);

onCreate(...) メソッドで?

于 2014-01-09T16:49:23.713 に答える