【问题标题】:YouTube : This video contains content from vevo?YouTube:此视频包含来自 vevo 的内容?
【发布时间】:2014-04-03 05:41:48
【问题描述】:

我正在尝试在我的应用程序中播放 YouTube 视频。一切正常。但是,当我尝试观看包含 Vevo 内容的视频时,它失败了。

我也曾尝试在 get_video_info 中传递el=vevo

http://www.youtube.com/get_video_info?video_id=uuZE_IRwLNI&el=vevo&ps=default&eurl=&gl=US&hl=en

stream

 {
    "fallback_host" = "tc.v12.cache7.googlevideo.com";
    itag = 22;
    quality = hd720;
    s = "8E6E5D13EB65FB653B173B94CB0BCC3A20853F5EDE8.5E2E87DF33EEDE165FEA90109D3C7D5DADA06B6BB60";
    type = "video/mp4; codecs=\"avc1.64001F, mp4a.40.2\"";
    url = "http://r7---sn-cvh7zn7r.googlevideo.com/videoplayback?pcm2fr=yes&sver=3&expire=1393773646&itag=22&id=bae644fc84702cd2&upn=SjZd81MudQs&sparams=gcr%2Cid%2Cip%2Cipbits%2Citag%2Cpcm2fr%2Cratebypass%2Csource%2Cupn%2Cexpire&ms=au&gcr=in&mt=1393747698&source=youtube&ratebypass=yes&ipbits=0&fexp=935620%2C919120%2C912523%2C932288%2C914084%2C916626%2C937417%2C937416%2C913434%2C932289%2C936910%2C936913%2C902907&mv=m&key=yt5&ip=103.250.162.79";
}

当我使用url 时,它没有播放。有什么解决办法吗?

【问题讨论】:

  • 我期待的是赏金?
  • 对不起,我无法得到你?

标签: ios video youtube mpmovieplayercontroller


【解决方案1】:

YouTube 视频 URL 应包含签名(包含在 's' 字段中),要使用此 URL,您需要先解密签名并将其添加到 URL。

签名解密器可以在视频的网页上找到(即youtube.com/watch?v=VIDEO_ID)。

我无法提供更多信息,因为这违反了 YouTube 服务条款:)。

【讨论】:

  • 嘿,我尝试了很多但无法成功,我该如何解密签名。如果您知道任何想法,请帮助我
  • 我当然知道如何解密它,但我不想分享它,因为我会违反 YouTube 服务条款。我能说的唯一提示是可以在 JavaScript 中找到解密器,在浏览页面源时可以找到指向此 JavaScript 的链接,希望这能有所帮助。
【解决方案2】:

某些视频应用了域级白名单或黑名单。这由内容所有者自行决定。

如果存在白名单或黑名单,并且无法确定嵌入站点的域(可能是因为在您的原生应用程序中没有真正的引用域),那么默认行为是阻止播放。

这篇博文也有更多细节:http://apiblog.youtube.com/2011/12/understanding-playback-restrictions.html

由于域白/黑名单的工作方式,该特定视频只能在嵌入到具有真实引用 URL 的真实网站上时播放。而且,我们不会通过 API 公开这些列表。这是一个长期的功能要求

【讨论】:

    【解决方案3】:

    get_video_info 仅适用于允许在其他网站作为嵌入视频观看的视频。我在 get_video_info 上苦苦挣扎,但可以找到任何 vevo 的解决方案。但是我能够通过检索实际的视频页面使其工作,在实际的视频页面中,您必须获取播放器版本并点击 url(在代码中指定)以获取流链接和实际签名。

    youtube 将来可能会改变这一点,但今天以下解决方案对我来说非常有用。

    它的c#你应该知道如何将它转换成object-C,下面代码的入口点是ExtractUrls函数,记得传递给它视频页面的html。

    例如http://www.youtube.com/watch?v=J5iS3tULXMQ&nomobile=1的html内容

    private static List<string> ExtractUrls(string html)
    {
        string Player_Version = Regex.Match(html, @"""\\/\\/s.ytimg.com\\/yts\\/jsbin\\/html5player-(.+?)\.js""").Groups[1].ToString();
        string Player_Code = new WebClient().DownloadString("http://s.ytimg.com/yts/jsbin/" + "html5player-" + Player_Version + ".js");
    
        html = Uri.UnescapeDataString( Regex.Match(html, @"""url_encoded_fmt_stream_map"":\s+""(.+?)""", RegexOptions.Singleline).Groups[1].ToString());
    
        var Streams = Regex.Matches(html, @"(^url=|(\\u0026url=|,url=))(.+?)(\\u0026|,|$)");
        var Signatures = Regex.Matches(html, @"(^s=|(\\u0026s=|,s=))(.+?)(\\u0026|,|$)");
        List<string> urls = new List<string>();
    
        for (int i = 0; i < Streams.Count - 1; i++)
        {
            string URL = Streams[i].Groups[3].ToString();
            if (Signatures.Count > 0)
            {
                string Sign = Sign_Decipher(Signatures[i].Groups[3].ToString(), Player_Code);
                URL += "&signature=" + Sign;
            }
            urls.Add(URL.Trim());
        }
    
        return urls;
    }
    
    public static string Sign_Decipher(string s, string Code)
    {
        string Function_Name = Regex.Match(Code, @"signature=(\w+)\(\w+\)").Groups[1].ToString();
        var Function_Match = Regex.Match(Code, "function " + Function_Name + @"\((\w+)\)\{(.+?)\}",RegexOptions.Singleline);
        string Var = Function_Match.Groups[1].ToString();
        string Decipher = Function_Match.Groups[2].ToString();
        var Lines = Decipher.Split(';');
    
        for (int i = 0; i < Lines.Length; i++)
        {
            string Line = Lines[i].Trim();
            if (Regex.IsMatch(Line, Var + "=" + Var + @"\.reverse\(\)"))
            {
                char[] charArray = s.ToCharArray();
                Array.Reverse(charArray);
                s = new string(charArray);
            }
            else if (Regex.IsMatch(Line, Var + "=" + Var + @"\.slice\(\d+\)"))
            {
                s = Slice(s, Convert.ToInt32(Regex.Match(Line, Var + "=" + Var + @"\.slice\((\d+)\)").Groups[1].ToString()));
            }
            else if (Regex.IsMatch(Line, Var + @"=\w+\(" + Var + @",\d+\)"))
            {
                s = Swap(s, Convert.ToInt32(Regex.Match(Line, Var + @"=\w+\(" + Var + @",(\d+)\)").Groups[1].ToString()));
            }
            else if (Regex.IsMatch(Line, Var + @"\[0\]=" + Var + @"\[\d+%" + Var + @"\.length\]"))
            {
                s = Swap(s, Convert.ToInt32(Regex.Match(Line, Var + @"\[0\]=" + Var + @"\[(\d+)%" + Var + @"\.length\]").Groups[1].ToString()));
            }
        }
    
        return s;
    }
    
    private static string Slice(string Input, int Length)
    {
        return Input.Substring(Length, Input.Length - 1);
    }
    
    private static string Swap(string Input, int Position)
    {
        var Str = new StringBuilder(Input);
        var SwapChar = Str[Position];
        Str[Position] = Str[0];
        Str[0] = SwapChar;
        return Str.ToString();
    }
    

    感谢this code project artical下的cmets

    【讨论】:

    • 很好的答案,我能够在 30 分钟内设置一个 Xamarin 项目。无论如何,该代码不适用于每个 YouTube 视频,例如 Vevo 视频,不会被下载。
    • 谢谢。是的 youtube 上个月做了一些改变,我的应用程序也停止了对一些视频的工作,如果你找到一些解决方法请分享,我被困在别的东西上 :(
    • 嗯,我唯一的猜测是需要处理签名,但这是非常复杂的事情:阅读此处github.com/0xced/XCDYouTubeKit/issues/11
    猜你喜欢
    • 2014-02-03
    • 1970-01-01
    • 2013-11-18
    • 2013-05-09
    • 1970-01-01
    • 2019-01-31
    • 2012-09-07
    • 2014-02-23
    • 1970-01-01
    相关资源
    最近更新 更多