【问题标题】:Using HttpURLConnection to get Vimeo video file using token使用 HttpURLConnection 使用令牌获取 Vimeo 视频文件
【发布时间】:2016-07-20 16:18:39
【问题描述】:

我正在开发一个允许本地离线观看视频内容的安卓应用。

我正在尝试使用他们的 API 从 Vimeo 下载视频,但我遇到了一个我认为与 url 本身及其身份验证有关的问题。

我被告知该 URL 是 HTTP 302 重定向。

我已经使用来自https://archive.org/download/Popeye_forPresident/Popeye_forPresident_512kb.mp4 的大力水手视频测试了我的程序,它可以正常工作。但是当我输入 Vimeo 链接时,它甚至无法连接。

这是运行实际连接的方法。

public String DownloadFile(String fileURL, String fileName) {
    InputStream in = null;
    BufferedInputStream inStream = null;
    FileOutputStream out = null;
    HttpURLConnection connection = null;

    try {
        File FileDir = mContext.getExternalFilesDir(Environment.DIRECTORY_MOVIES);

        URL url = new URL(fileURL);

        connection = (HttpURLConnection) url.openConnection();
        connection.setRequestMethod("GET");
        connection.setDoOutput(true);
        connection.connect();

        //Code stops here with vimeo video but not with popeye video.

        ...

        out = new FileOutputStream(new File(FileDir, fileName + ".mp4"));
        in = connection.getInputStream();
        inStream = new BufferedInputStream(in, 1024 * 5);
        byte[] buffer = new byte[1024 * 5];

        int len;
        while ((len = inStream.read(buffer)) > 0) {
            out.write(buffer, 0, len);
        }

    } 
    ... //catch and finally { flush, close and disconnection}

    return null;
}

这是设置 url 并执行它的异步任务。

class DownloadFileFromURL extends AsyncTask<String, String, String> {

     ...

    @Override
    protected String doInBackground(final String... args) {

//If it is a normal direct link such as site.com/video.mp4 (the popeye video)
//Set link to site.com/video.mp4 and save as "args[1]" on disk.

        if(FilenameUtils.isExtension(args[0], "mp4")){  
            DownloadFile(args[0], args[1]);             
        } 

//Else if a vimeo link (which it is)
        else if (args[0].contains("vimeo")){            
            final int pos = Integer.parseInt(args[2]);  

//Use Vimeo API to get the videos from Vimeo.                    
                VimeoClient.getInstance().fetchNetworkContent(CHANNELS_VIDEO_URI, new ModelCallback<VideoList>(VideoList.class) {

                @Override
                public void success(VideoList videoList) {

                    if (videoList != null && videoList.data != null && !videoList.data.isEmpty()) {
                        Video video = videoList.data.get(pos);

                        ArrayList<VideoFile> videoFiles = video.files;
                        if(videoFiles != null && !videoFiles.isEmpty()) {
                            VideoFile videoFile = videoFiles.get(0); 

//Set link to the link that you retrieve.
//Example: http://player.vimeo.com/external/175231540.hd.mp4?s=78206f99af10e32354851f6ca62252782b1393fb&profile_id=174&oauth2_token_id=903072961

                            String link = videoFile.link;
                            DownloadFile(link, args[1]);
                        }
                    }
                }

                @Override
                public void failure(VimeoError error) {
                    Toast.makeText(mContext, "Failure in VideoList Reading", Toast.LENGTH_LONG).show();
                }
            });
        }
        return null;
    }

    ...

}

但是链接http://player.vimeo.com/external/175231540.hd.mp4?s=78206f99af10e32354851f6ca62252782b1393fb&profile_id=174&oauth2_token_id=903072961 没有连接到。我尝试在 hd.mp4 之后删除所有内容,但我认为这不起作用,因为在浏览器中访问该链接会导致出现授权被拒绝错误。

如何连接到此链接并使用令牌从 HTTP 302 重定向中获取文件?

【问题讨论】:

    标签: java android video


    【解决方案1】:

    一些事情......

    我认为您不应该假设传递给 doInBackground 的位置将与网络调用以获取视频列表后的位置相同。如果将新视频添加到该列表中怎么办?

    CHANNELS_VIDEO_URI 是什么?只有 Vimeo PRO 成员可以访问文件数组,并且只能访问他们自己的视频。您正在使用的 Vimeo 网络库的ReadMe 中提到了这一点。这是您拥有的视频频道吗?

    您评论中的那个 URL 看起来不正确,它代表的是播放器,而不是视频文件。我的一部分不相信 URL 来自VideoFile.link

    files 数组还可能包含 mp4 文件以外的链接,因此您也应该注意这一点。

    每个 Video 对象上都有一个 download 数组。它类似于files,除了这些应该是指向实际视频资源的链接(并且您不会获得 HLS!)。只有当视频的设置允许下载视频时,这些才可用。

    【讨论】:

    • 确实如此。这就是我相信的重定向 HTTP。这是我直接从代码中的日志打印输出中得到的。我是 Pro 会员,是的,这是我拥有的频道。我所做的是在 vimeo 的客户端中填充一个频道,然后我使用 vimeo 的方法从频道中提取视频列表,然后访问它的文件数组(正如你所说的需要 Pro)
    • 是的,HLS (m3u8) 文件可能在数组中,但我必须单独测试。至于您关于添加新视频的观点,这不是问题,因为拉动视频的线(Video video = videoList.data.get(pos);) 根据所选网格视图项的索引进行选择。仅当我的网格视图中的索引多于 vimeo 频道中的视频时,才会发生该错误。只要我不使用频道中不存在的列表更新我的适配器,我就不会出现错误。我也可以用这个来编写错误处理代码。
    • 不过,这些文件并不是用来下载的。如果您正在寻找可以下载的文件,请使用 Video.download,它是 VideoFiles 的 ArrayList,类似于文件,但允许下载(在视频设置中指定,但由于您拥有这些,您可以将它们全部标记为可下载)。
    • 我更新了我的答案以突出显示下载数组列表。
    • 抱歉,这是我在处理其他问题时让我坐下来的。我查找了您声称是视频对象一部分的下载数组列表,但我找不到它。我查看了我拥有的源代码,但在 Video.java 中找不到它。于是我去了 GitHub,在 Video.java 中找到了。我相信这个下载对象来自最近的提交,它不是 v1.0.1 的一部分,但目前在 v1.1.0 中可用。我应该下载 github repo 并尝试将其添加为子模块吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-10
    • 2018-05-23
    • 2012-06-28
    • 2021-01-07
    • 2016-01-10
    • 1970-01-01
    相关资源
    最近更新 更多