在Android 5.1及更高版本的VideoView中从Google云端硬盘流式传输视频

时间:2016-06-03 03:32:14

标签: android video video-streaming google-drive-android-api android-5.1.1-lollipop

所以很多人都以这种或那种形式提出这个问题,但没有人似乎有答案,所提出的答案都没有对我有用,所以我再次提问。

问题在于,从Android 5.1开始,某些视频网址无法播放。日志中唯一的错误是

06-02 23:22:53.940 32469-32469/com.example.myapp W/MediaPlayer: Couldn't open https://<URL...>: java.io.FileNotFoundException: No content provider: https://<URL...>
06-02 23:22:54.081 32469-32499/com.example.myapp D/OpenGLRenderer: endAllActiveAnimators on 0x7d9cc48800 (GridView) with handle 0x7d9c084400
06-02 23:22:54.857 32469-32480/com.example.myapp I/art: Background sticky concurrent mark sweep GC freed 53228(4MB) AllocSpace objects, 1(20KB) LOS objects, 33% free, 9MB/13MB, paused 7.612ms total 44.857ms
06-02 23:22:55.487 32469-3238/com.example.myapp E/MediaPlayer: error (1, -2147483648)
06-02 23:22:55.500 32469-32469/com.example.myapp E/MediaPlayer: Error (1,-2147483648)
06-02 23:22:55.500 32469-32469/com.example.myapp D/VideoView: Error: 1,-2147483648
06-02 23:22:55.503 32469-32469/com.example.myapp D/VideoPlayerActivity: MediaPlayer error: what = 1 extra = -2147483648
06-02 23:22:55.556 32469-32474/com.example.myapp I/art: Do partial code cache collection, code=62KB, data=52KB
06-02 23:22:55.556 32469-32474/com.example.myapp I/art: After code cache collection, code=62KB, data=52KB
06-02 23:22:55.556 32469-32474/com.example.myapp I/art: Increasing code cache capacity to 256KB

现在有些人会告诉您,您想播放的视频在设备上没有支持编解码器。没办法......首先,我仍然可以使用Android 5.0.2在同一设备上播放相同的视频,但不能使用5.1.1。其次,如果我将视频网址加载到5.1.1及更高版本的WebView中,它将会播放。所以它不是编解码器或硬件。我已经尝试了各种各样的URL编码/解码,但这些都没有用。

以下是我使用的代码:

Uri videoUri = Uri.parse(vidAddress);
        MediaController mediaController = new MediaController(this);
        mediaController.setAnchorView(videoView);
        videoView.setMediaController(mediaController);
        videoView.setVideoURI(videoUri, headers);
        videoView.seekTo(resumePoint);
        videoView.setMediaController(null);
        videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(final MediaPlayer mp) {
                View loadingIndicator = findViewById(R.id.loading_indicator);
                loadingIndicator.setVisibility(View.GONE);

                videoProgress.setMax(videoView.getDuration());
                videoProgress.setSecondaryProgress(videoView.getDuration());
                endTime.setText(getTimeString(videoView.getDuration()));
            }
        });

        videoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(final MediaPlayer mp) {
                finish();
            }
        });

videoView.start();

更新:由于某些网址确实可以使用上述代码,因此我添加了更多信息。我使用的网址是存储在Google云端硬盘中的MP4视频。使用Google云端硬盘文件响应中的videoUri字段填充downloadUrl变量,headers包含授权标头以及登录帐户的令牌。就像我说的那样,所有这些代码,从上面不加改变,在API 5.0.2及更低版本上都没有问题,而不是在5.1.1上。测试是使用相同硬件的两个设备(两个Nexus 5x和两个Nexus播放器)进行的,只更改操作系统版本。上面的代码适用于5x和运行5.0.2的播放器,但不适用于运行5.1.1。

3 个答案:

答案 0 :(得分:0)

在幕后,当您致电setVideoUri()时,它正在调用MediaPlayer.setDataSource(Context, Uri)`,它只支持内容URI(即不支持http / https网址)。

相反,建议使用功能更全面的ExoPlayer,并完全支持来自网址的流式传输。如果您想维护VideoView类型界面,可以使用包装库,例如ExoMedia

答案 1 :(得分:0)

你试过用过吗? videoView.start()videoView.setVideoURI()。我已经尝试使用HTTP URL地址,它可以工作。 或者HTTPs协议可能有问题?

答案 2 :(得分:0)

使用MediaController播放来自Url的视频

VideoView videoview;
MediaController mediacontroller;
try {
            mediacontroller = new MediaController(VideoPlayActivity.this);
            mediacontroller.setAnchorView(videoview);
            Uri video = Uri.parse(VideoURL);
            videoview.setMediaController(mediacontroller);
            videoview.setVideoURI(video);

        } catch (Exception e) {
            Log.e("Error", e.getMessage());
            e.printStackTrace();
        }