当前位置: 首页 > 知识库问答 >
问题:

Android 5.1+上的VideoView中来自Google Drive的流式视频

巫马炫明
2023-03-14

很多人都以这样或那样的形式问过这个问题,但似乎没有人有答案,而且没有一个建议的答案对我有效,所以我再问一次。

问题是,在Android5.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

现在有些人会告诉你,你想播放的视频只是设备上没有支持编解码器。不可能...首先,我仍然可以在使用Android5.0.2的同一设备上播放相同的视频,但不能在5.1.1上播放。其次,如果我把视频url加载到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();

更新:因为确实有一些URL可以使用上面的代码,所以我要添加一些更多的信息。我使用的网址是MP4视频存储在谷歌驱动器。videouri变量是使用Google驱动器文件响应中的downloadurl字段填充的,headers包含带有登录帐户标记的授权头。正如我所说的,所有这些代码,在上面没有修改,在API5.0.2和更低的版本上没有问题,而在5.1.1上没有问题。测试是用两个相同硬件的设备(两个Nexus 5X和两个Nexus播放机)进行的,除了OS版本之外,没有其他变化。上面的代码适用于5x和运行5.0.2的播放器,但不适用于运行5.1.1的播放器。

共有1个答案

壤驷兴朝
2023-03-14

实际上,当您调用setvideouri()时,它调用的是MediaPlayer.setDataSource(Context,Uri)`,它只支持内容Uri(即,不支持HTTP/HTTPS URL)。

相反,建议使用ExoPlayer,它的功能更全,完全支持从web URL流媒体。如果希望维护VideoView类型的接口,可以使用包装器库,如ExoMedia

 类似资料:
  • 我正在构建一个Android应用程序,需要从Google drive流式传输视频。视频链接是这样的:https://docs.Google.com/file/d/--id-- 我不能得到rtsp,所以它不能运行视频在videoview和它没有结束与mp4或3GP...所以我不能这样运行: Intent Intent=新的意图(Intent.action_view);Intent.SetDataAn

  • 本文向大家介绍Android原生视频播放VideoView的使用,包括了Android原生视频播放VideoView的使用的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Android原生视频播放VideoView的具体代码,供大家参考,具体内容如下 布局文件activity_video.xml 对应的Avtivity:VideoActivity.java 以上就是本文的全部内容,希

  • 我有一个blob数组(实际上是二进制数据--我可以表达它是最有效的。我现在使用Blobs,但可能或其他更好的方法)。每个Blob包含1秒的音频/视频数据。每秒都会生成一个新的Blob并将其追加到我的数组中。因此代码大致如下所示: 我的目标是将此音频/视频数据流式传输到HTML5元素。我知道Blob URL可以像下面这样生成和播放:

  • 我有一个反向代理设置与nginx。 如何将从后端服务器发送到nginx的http请求(包括头)记录到文件中? 也许nginx http代理模块中的某个指令可以帮助我做到这一点。 但我找不到任何有用的指示。

  • 我有一个应用程序whcih记录传入和传出语音呼叫,它在Marshmallow或更高版本的设备上运行良好versions.But当我尝试在android 5.1.1上运行它时,它给我错误,应用程序停止响应。 我用于录制语音通话的代码是 - 编辑-我按照下面的回答做了,但是错误仍然存在。通过稍微调整代码,调用状态现在只被调用一次,但应用程序仍然崩溃,甚至异常也是一样的。

  • 我正在流式录制的PCM音频从一个浏览器与web音频API。 我正在用binaryJS(websocket连接)将它流到一个nodejs服务器上,并尝试使用speaker npm模块在服务器上播放该流。 这是我的当事人。音频缓冲器首先是非交错的IEEE 32位线性PCM,标称范围在-1至+1之间。我从两个PCM频道中的一个开始,并在下面进行流式传输。 现在我接收数据作为缓冲区,并尝试将其从npm包写