2

我正在尝试流式传输视频并使用 VideoView 播放。我使用 setVideoURI() 为视图提供视频的源 URL,如下所示。使用像 urlString = "www.myvideoserver.com/videos/bigbuckbunny.mp4" 这样的硬编码值,视频可以正常播放。但是,当 urlString 被赋予来自意图的值(来自用户选择视频的上一个活动)时,我收到消息:“抱歉,无法播放视频”。我读过一个常见的原因是视频格式,就像这里这里描述的那样. 我几乎可以肯定这不是格式问题,因为我可以在 URL 固定时播放视频(我知道这一点是因为我可以从 Log.d("PVurl", urlString); 中看到 urlString 的值是与我修复的完全相同。也就是说,在 LogCat 中,我将值复制粘贴到该行urlString = getIntent()... // "www.myvideoserver.com/videos/bigbuckbunny.mp4"中,它可以工作,但当 urlString 设置为意图返回值时它不起作用。LogCat Errror 面板给出以下内容:

04-13 17:35:32.786: ERROR/MediaPlayer(2620): error (1, -1007)
04-13 17:35:32.786: ERROR/MediaPlayer(2620): Error (1,-1007)

我在互联网上搜索过,但似乎没有人以前遇到过这样的错误代码。

如果有人知道可能是什么问题,我将不胜感激。谢谢!

public void playvideo () { // obtain URL of the requested video from the intent in previous activity

    try
    {
        urlString =  getIntent().getStringExtra("mypackage.fulladdr");

        if (urlStr != null)
        {
            Log.d("PVurl", urlString);

            VideoView v = (VideoView) findViewById(R.id.videoView1);

            // play video

            v.setVideoURI(Uri.parse(urlString));
            v.setMediaController(new MediaController(this));
            v.start();

            v.setOnCompletionListener(new OnCompletionListener() {
                public void onCompletion(MediaPlayer mp) {
                    showRatingDialog();
                }
            });
        }
    }
    catch (Exception e)
    {
        Log.d("PV_TAG", +e.getMessage());
        e.printStackTrace();
    }
}
4

4 回答 4

1

您尚未添加 Uri 需要找出它所指内容的方案 (http,在您的情况下)。

urlString = "www.myvideoserver.com/videos/bigbuckbunny.mp4"将其更改为 urlString = "http://www.myvideoserver.com/videos/bigbuckbunny.mp4"

于 2012-04-14T05:02:01.733 回答
1

(1, -1007) 错误表示:MEDIA_ERROR_UNKNOWN - “文件或网络相关的操作错误。”

这可能来自损坏的文件

另请参阅 android.media.MediaPlayer.OnErrorListener#onError http://developer.android.com/reference/android/media/MediaPlayer.OnErrorListener.html#onError的 javadoc

@param what the type of error that has occurred:
MEDIA_ERROR_UNKNOWN
MEDIA_ERROR_SERVER_DIED

@param extra an extra code, specific to the error. Typically implementation dependent.
MEDIA_ERROR_IO
MEDIA_ERROR_MALFORMED
MEDIA_ERROR_UNSUPPORTED
MEDIA_ERROR_TIMED_OUT
于 2014-03-12T17:57:23.623 回答
0

我尝试了同样的事情并且能够让它工作。也许您的代码中发生了其他事情。这是我所拥有的:

// Intent to start the activity that launches the video player
Intent i = new Intent(this, ExampleActivity.class);
i.putExtra("url", "http://www.yourvideo.com/yourvid.m4v");
startActivity(i);

这是处理播放器的代码:

private MediaController mController;
private Uri videoUri; 
private int percentBuffered= 0;
private VideoView videoView;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.your_layout);

    mController = new MediaController(this);

    videoView = (VideoView) findViewById(R.id.videoView1);

    // access String from the intent that launched this Activity
    videoUri = Uri.parse(getIntent().getStringExtra("url"));
}

@Override
public void onResume() {
    super.onResume();
    videoView.setOnCompletionListener(this);
    try {
        videoView.setVideoURI(videoUri);
        mController.setMediaPlayer(videoView);
        videoView.setMediaController(mController);
        videoView.requestFocus();
        videoView.start();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

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

@Override
public boolean onTouchEvent(MotionEvent event) {
    mController.show();
    return super.onTouchEvent(event);
}

@Override
public int getBufferPercentage() {
    return percentBuffered;
}

@Override
public int getCurrentPosition() { 
    return videoView.getCurrentPosition();
}

@Override
public int getDuration() {
    return videoView.getDuration();
}

@Override
public boolean isPlaying() {
    return videoView.isPlaying();
}

@Override
public void pause() {
    videoView.pause();
}

@Override
public void seekTo(int pos) {
    videoView.seekTo(pos);
}

@Override
public void start() {
    videoView.start();
}

@Override
public void onBufferingUpdate(MediaPlayer mp, int percent) {
    percentBuffered = percent;
}

@Override
public void onCompletion(MediaPlayer mp) {

}

public boolean canPause() {
    return true;
}

public boolean canSeekBackward() {
    return true;
}

public boolean canSeekForward() {
    return true;
}
于 2012-04-14T05:02:49.890 回答
0

好吧,经过数小时徒劳的挖掘以找出 MediaPlayer error(1, -1007) 的含义后,我发现了这个问题。

实际上,这与 getIntent().getStringExtra("mypackage.fulladdr"); 行这一相当不幸的事实有关。返回一个末尾带有额外空格的字符串。我认为这是 getIntent() 的实现问题。任何人都知道在哪里报告这些错误,那就太好了。

感谢@Akhil 和@javaMe 的尝试!

于 2012-04-17T05:38:55.413 回答