【问题标题】:MediaPlayer cannot play video from urlMediaPlayer 无法从 url 播放视频
【发布时间】:2015-10-24 19:42:46
【问题描述】:

我正在使用 TextureView 从我的 App-Engine 服务器播放视频。如果我在浏览器中打开链接,我可以正常播放视频。但是 MediaPlay 有以下关于文件未找到然后无法播放视频的错误

I/MediaPlayer: Need to enable context aware info
 E/MediaPlayer-JNI: QCMediaPlayer mediaplayer NOT present
 D/MediaPlayer: setDataSource IOException happend : 
 D/MediaPlayer: java.io.FileNotFoundException: No content provider: https://companycloud.appspot.com/watchvideo/?videoid=1234567771234567
 D/MediaPlayer:     at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1074)
 D/MediaPlayer:     at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:927)
 D/MediaPlayer:     at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:854)
 D/MediaPlayer:     at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1085)
 D/MediaPlayer:     at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1059)
 D/MediaPlayer:     at com.company.app.android.fragment.VideoFragment.playNewVideo(VideoFragment.java:411)
 D/MediaPlayer:     at com.company.app.android.fragment.VideoFragment.access$400(VideoFragment.java:63)
 D/MediaPlayer:     at com.company.app.android.fragment.VideoFragment$1.onReceive(VideoFragment.java:120)
 D/MediaPlayer:     at android.support.v4.content.LocalBroadcastManager.executePendingBroadcasts(LocalBroadcastManager.java:297)
 D/MediaPlayer:     at android.support.v4.content.LocalBroadcastManager.access$000(LocalBroadcastManager.java:46)
 D/MediaPlayer:     at android.support.v4.content.LocalBroadcastManager$1.handleMessage(LocalBroadcastManager.java:116)
 D/MediaPlayer:     at android.os.Handler.dispatchMessage(Handler.java:102)
 D/MediaPlayer:     at android.os.Looper.loop(Looper.java:145)
 D/MediaPlayer:     at android.app.ActivityThread.main(ActivityThread.java:5837)
 D/MediaPlayer:     at java.lang.reflect.Method.invoke(Native Method)
 D/MediaPlayer:     at java.lang.reflect.Method.invoke(Method.java:372)
 D/MediaPlayer:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1388)
 D/MediaPlayer:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1183)
 D/MediaPlayer: Couldn't open file on client side, trying server side
10-24 12:25:26.665 6742-7036/com.company.app.android E/MediaPlayer: error (1, -2147483648)
10-24 12:25:26.685 6742-6742/com.company.app.android E/MediaPlayer: Error (1,-2147483648)

【问题讨论】:

  • 为什么不使用 VideoView ?
  • 我的 videoView 有很多问题,所以我切换了。但这肯定不是问题的解决方案。你知道不能让 TextureView 工作吗?

标签: android video android-mediaplayer textureview


【解决方案1】:

好吧,我不能发表评论,因为没有任何参考代码可供查看,所以这里有一些建议:

1) 该解决方案适用于 Android 4.0 或更高版本。

onSurfaceTextureAvailable() 方法中初始化 MedialPlayer 对象并将其放入 try/catch 块中。

解析 Uri。由于通常使用 Uri 对象将内容的引用传递给 ContentProvider。

@Override
public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int i, int i2) {
    Surface surface = new Surface(surfaceTexture);

    try {
        mMediaPlayer= new MediaPlayer(); 
        // parse the URL path
        mMediaPlayer.setDataSource(getApplicationContext(), Uri.parse(URL_PATH));
        mMediaPlayer.setSurface(surface);
        mMediaPlayer.setLooping(true);

        mMediaPlayer.prepareAsync();


        mMediaPlayer.setOnBufferingUpdateListener(this);
        mMediaPlayer.setOnCompletionListener(this);
        mMediaPlayer.setOnVideoSizeChangedListener(this);
        mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);

        // Play video when the media source is ready for playback.
        mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mediaPlayer) {
                mediaPlayer.start();
            }
        });

    } catch (IllegalArgumentException e) {
        Log.d(TAG, e.getMessage());
    } catch (SecurityException e) {
        Log.d(TAG, e.getMessage());
    } catch (IllegalStateException e) {
        Log.d(TAG, e.getMessage());
    } catch (IOException e) {
        Log.d(TAG, e.getMessage());
    }
}

对于流来说,更喜欢使用 prepareAsync(),因为它会立即返回,而不是阻塞直到缓冲足够的数据。 调用 MediaPlayer.prepareAsync() 方法,因为您使用构造函数来创建 MediaPlayer 对象。

播放完视频后别忘了清理内存

@Override
protected void onDestroy() {
    super.onDestroy();
    if (mMediaPlayer != null) {
        mMediaPlayer.stop();
        mMediaPlayer.release();
        mMediaPlayer = null;
    }
}

希望对你有帮助!

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多