java - 无法从服务器 android 播放视频

标签 java android

我想在流媒体模式下从服务器播放 .mp4 和 .3gp 视频,但视频没有播放,只收到“抱歉,无法播放此视频”的消息我已经搜索过这个但没有得到任何解决方案,如果有人有任何解决方案请帮助我。提前致谢。 我的代码

    getWindow().setFormat(PixelFormat.TRANSLUCENT);
    String path = "http://commonsware.com/misc/test2.3gp";
    mVideoView.setVideoPath(path);
    holder=mVideoView.getHolder();
    mp=new MediaPlayer(); 
    mp.setDataSource(path);
    mp.setScreenOnWhilePlaying(true);
    mp.setDisplay(holder);
    mp.prepare();
    mp.start();
    mVideoView.setOnCompletionListener(new OnCompletionListener() {

        public void onCompletion(MediaPlayer mp) {
            // TODO Auto-generated method stub
        finish();   
        }
    });

最佳答案

为你的activity实现OnPreparedListener,尝试把mp.start()放到onPrepared方法中,

public class VideoPlayerActivity extends Activity implements
        OnBufferingUpdateListener, OnCompletionListener,
        OnPreparedListener, OnVideoSizeChangedListener, SurfaceHolder.Callback {

    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 static final int STREAM_VIDEO = 5;
    private boolean mIsVideoSizeKnown = false;
    private boolean mIsVideoReadyToBePlayed = false;

    /**
     * 
     * Called when the activity is first created.
     */
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.main);
        mPreview = (SurfaceView) findViewById(R.id.VideoView);
        holder = mPreview.getHolder();
        holder.addCallback(this);
        holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }

    private void playVideo(Integer Media) {
        doCleanUp();
        try {           
            path = "http://commonsware.com/misc/test2.3gp";            
            // Create a new media player and set the listeners
            mMediaPlayer = new MediaPlayer();
            mMediaPlayer.setDataSource(path);
            mMediaPlayer.setDisplay(holder);
            mMediaPlayer.prepare();
            mMediaPlayer.setOnBufferingUpdateListener(this);
            mMediaPlayer.setOnCompletionListener(this);
            mMediaPlayer.setOnPreparedListener(this);
            mMediaPlayer.setOnVideoSizeChangedListener(this);

        } catch (Exception e) {
            Log.e(TAG, "error: " + e.getMessage(), e);
        }
    }

    public void onBufferingUpdate(MediaPlayer arg0, int percent) {
        Log.d(TAG, "onBufferingUpdate percent:" + percent);

    }

    public void onCompletion(MediaPlayer arg0) {
        Log.d(TAG, "onCompletion called");
    }

    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 onPrepared(MediaPlayer mediaplayer) {
        Log.d(TAG, "onPrepared called");
        mIsVideoReadyToBePlayed = true;
        if (mIsVideoReadyToBePlayed && mIsVideoSizeKnown) {
            startVideoPlayback();
        }
    }

    public void surfaceChanged(SurfaceHolder surfaceholder, int i, int j, int k) {
        Log.d(TAG, "surfaceChanged called");

    }

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


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


    }

    @Override
    protected void onPause() {
        super.onPause();
        releaseMediaPlayer();
        doCleanUp();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        releaseMediaPlayer();
        doCleanUp();
    }

    private void releaseMediaPlayer() {
        if (mMediaPlayer != null) {
            mMediaPlayer.release();
            mMediaPlayer = null;
        }
    }

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

    private void startVideoPlayback() {
        Log.v(TAG, "startVideoPlayback");
        holder.setFixedSize(mVideoWidth, mVideoHeight);
        mMediaPlayer.start();
    }
}

关于java - 无法从服务器 android 播放视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14080579/

相关文章:

android - 无法从 Android 中的 mongodb 服务器获取文档列表

android - 如何使用 RajawaliVR 或 Rajawali 播放 360 视频

Java 关闭 IOStream 最后给出错误 : Unhandled Exception: java. io.IOException

java - 如何在 Java 中打印变量的地址

java - Sonar 扫描 - 不应存储或直接返回可变成员

android - 如何确定 Android GPU 时钟?

java - Android 2.1 设备不会向左旋转横向

java - 在 Android 应用程序中使用 Json

android - 上下文和内存泄漏

android - TextView.setText()使我的应用程序崩溃