【问题标题】:File protocol support for VideoView or WebView?VideoView 或 WebView 的文件协议支持?
【发布时间】:2017-12-17 01:34:32
【问题描述】:

在我的台式计算机上的 Google Chrome 浏览器中,我可以使用以下链接流式传输驻留在我的服务器上的 mp4 视频文件:

file://192.168.0.1/Videos/video.mp4

我想在 Android 应用中做同样的事情,但是当我尝试将这个相同的链接放入 VideoView 或 WebView 时会遇到错误。

在 VideoView 中它会给出一个错误,说它无法播放这个文件,而在 WebView 中它会给出一个文件权限错误。

我正在使用的 VideoView 代码是:

    // Declare variables
    ProgressDialog pDialog;
    VideoView videoview;

    // Insert your Video URL
    String VideoURL = "file://192.168.0.1/Videos/video.mp4";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Get the layout from video_main.xml
        setContentView(R.layout.videoview_main);
        // Find your VideoView in your video_main.xml layout
        videoview = (VideoView) findViewById(R.id.VideoView);
        // Execute StreamVideo AsyncTask

        // Create a progressbar
        pDialog = new ProgressDialog(VideoViewActivity.this);
        // Set progressbar title
        pDialog.setTitle("Android Video Streaming Tutorial");
        // Set progressbar message
        pDialog.setMessage("Buffering...");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(false);
        // Show progressbar
        pDialog.show();

        try {
            // Start the MediaController
            MediaController mediacontroller = new MediaController(
                    VideoViewActivity.this);
            mediacontroller.setAnchorView(videoview);
            // Get the URL from String VideoURL
            Uri video = Uri.parse(VideoURL);
            videoview.setMediaController(mediacontroller);
            videoview.setVideoURI(video);

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

        videoview.requestFocus();
        videoview.setOnPreparedListener(new OnPreparedListener() {
            // Close the progress bar and play the video
            public void onPrepared(MediaPlayer mp) {
                pDialog.dismiss();
                videoview.start();
            }
        });

    }

WebView 代码是:

WebView webview = (WebView) findViewById(R.id.webView1);
webview.setWebViewClient(new WebViewClient());
webview.getSettings().setJavaScriptEnabled(true);
webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
webview.getSettings().setPluginState(WebSettings.PluginState.ON);
webview.getSettings().setMediaPlaybackRequiresUserGesture(false);
webview.setWebChromeClient(new WebChromeClient());
webview.loadUrl("file://192.168.0.1/Videos/video.mp4");

VideoView 或 WebView 中文件协议的链接格式是否不同,导致此功能无法正常工作,还是其他问题?

【问题讨论】:

    标签: android webview video-streaming android-videoview


    【解决方案1】:

    我猜您正在使用 Windows 或 Linux 机器作为服务器。如果您希望 VideoView 正常工作,您必须实现 Android 支持的视频流格式。

    只是为了明确file:// URI 方案没有指定网络协议和“SMB/CIFS”,Windows 原生和带有 SAMBA 服务器的 Linux 用于文件共享的不是 Android 原生的。

    发件人:https://tools.ietf.org/id/draft-kerwin-file-scheme-07.html#rfc.section.3.4

    最后一段很重要:

    “文件”URI 方案的不寻常之处在于它没有指定 共享文件的 Internet 协议或访问方法;因此,它的 主机之间的网络协议的效用是有限的。示例 确实定义此类访问方法的文件服务器协议包括 SMB/CIFS [MS-SMB2]、NFS [RFC3530] 和 NCP [NOVELL]。

    对于可行的解决方案:我建议为您的服务器搜索 http/https 视频流。

    【讨论】:

    • 感谢您的建议,我会为我的 Linux 服务器研究 http/https 视频流。
    【解决方案2】:

    视频应采用 android 支持的格式。您可以找到支持的视频格式here

    另外file://不是一个URL,它表示文件系统。您必须提供一个以 httphttps 开头的 URL。

    当您将计算机用作服务器时,请确保您的 android 设备和您的计算机在同一个网络中。否则安卓设备将找不到您的视频。

    【讨论】:

      猜你喜欢
      • 2011-04-04
      • 2011-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-23
      相关资源
      最近更新 更多