【问题标题】:Android: Video cannot be played from non hard-coded URLAndroid:无法从非硬编码 URL 播放视频
【发布时间】:2012-04-14 02:56:02
【问题描述】:

我正在尝试流式传输视频并使用 VideoView 播放它。我使用 setVideoURI() 为视图提供视频的源 URL,如下所示。使用像 urlString = "www.myvideoserver.com/videos/bigbuckbunny.mp4" 这样的硬编码值,视频可以正常播放。但是,当 urlString 被赋予来自意图的值(来自用户选择视频的上一个活动)时,我收到消息:“抱歉,无法播放视频”。我读过视频格式是常见原因之一,就像herehere 所描述的那样。我几乎可以肯定这不是格式问题,因为我可以在 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();
    }
}

【问题讨论】:

    标签: android


    【解决方案1】:

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

    urlString = "www.myvideoserver.com/videos/bigbuckbunny.mp4"改成urlString = "http://www.myvideoserver.com/videos/bigbuckbunny.mp4"

    【讨论】:

    • 谢谢。但实际的 url 确实是“myvideoserver.com/videos/bigbuckbunny.mp4”,很抱歉没有在我之前的问题中包含“http”部分。就像我说的,问题是当 urlString 被硬编码为上述值(或任何其他有效的源 URL)时,视频播放器照常工作。但是,当它设置为来自另一个活动的变量时,播放器会失败并显示错误消息 (1, -1007)。所以我不太确定发生了什么......
    • 谢谢。但同样,硬编码的 URL 和变量分配的 URL (urlString) 中都有“http”。情况是这样的:假设您有一个名为'x'的变量:并假设您需要按如下方式分配y:y = sqrt(x);如果为 x 分配了一个实际值,例如 x =25,则它可以工作。但不是当 x = [其他操作的输出] 时,即在我的特定情况下的意图。但我确信意图会产生正确的值
    • 我的 url 和你说的一样,但我还是有问题......请帮帮我:(
    【解决方案2】:

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

    这可能来自损坏的文件

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

    @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
    

    【讨论】:

      【解决方案3】:

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

      // 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;
      }
      

      【讨论】:

      • 感谢分享。我已经修改了我的代码,使其看起来像你的,但它仍然有同样的问题。 setOnErrorListener 给出的错误码是 (1, -1007)
      【解决方案4】:

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

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

      感谢@Akhil 和@javaMe 的尝试!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-09
        • 2018-10-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多