【问题标题】:YouTube on Windows Phone with MediaElement带有 MediaElement 的 Windows Phone 上的 YouTube
【发布时间】:2010-11-24 22:49:55
【问题描述】:

This blog post 建议可以直接使用 Silverlight MediaEelement 播放 YouTube 视频。

<MediaElement HorizontalAlignment="Left"
VerticalAlignment="Top"
Source="http://www.youtube.com/get_video?
video_id=8yuIw_0ejLs&t=vjVQa1PpcFPrX3tFoahhu4DbniDIqTLkwybdm8xuCt8%3D&fmt=22"/>

我想知道这是否适用于 Windows Phone 7。我有一个基于播放 YouTube 上托管的视频的应用程序,如果能够更好地控制视频体验而不只是启动,那就太好了带有 YouTube 视频 URL 的浏览器。

【问题讨论】:

    标签: silverlight windows-phone-7 youtube mediaelement


    【解决方案1】:

    除非您有视频内容的直接链接,否则您无法在 Windows Phone 7 上显示 YouTube 视频。据我所知,get_video 不再可供公众访问。

    【讨论】:

    • 嗯,所以我想问题随后转移到,是否有一种允许的方法可以通过 youtube 的官方 API 访问视频的直接链接?或者这通常是不允许的?
    • 没有官方API方法可以下载视频。有一些变通方法和“黑客”,但它们并不普遍,也没有很好的记录。
    • 好的,谢谢...这有助于我为我的应用设定方向和期望:-)
    【解决方案2】:

    引用Windows Phone Developer FAQ

    如何在我的应用中播放 youtube 视频?

    使用 WebBrowserTask 并在浏览器中打开目标 URL;如果安装了youtube应用就会播放,如果没有安装会提示用户安装后再播放。

    【讨论】:

      【解决方案3】:

      对于其他仍然好奇的人来说,要克服的问题是获得指向视频的直接链接,这确实需要一些小技巧,但它非常可靠且易于操作。首先,您需要视频 id,这样您就可以获得可以使用 youtube api 的 youtube url。然后做这样的事情。我几乎将用户脚本转换为 Silverlight。

      WebClient client = new WebClient();
      string url = "http://www.youtube.com/watch?v=HLQqOpILDcI";
      client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(ClientDownloadStringCompleted);
      client.DownloadStringAsync(new Uri(url, UriKind.Absolute));
      

      下一点看起来很糟糕。

          private void ClientDownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
          {
              rx = new Regex("(?<=url_encoded_fmt_stream_map=)([^(\\\\)]*)(?=\\\\)", RegexOptions.IgnoreCase);
              match = rx.Matches(flashvars);
              string video_format = match[0].ToString();
      
              string sep1="%2C"; 
              string sep2="%26"; 
              string sep3="%3D";
              string link = "";
              string[] videoFormatsGroup = Regex.Split(video_format, sep1);
              for (var i=0;i<videoFormatsGroup.Length;i++){
                  string[] videoFormatsElem = Regex.Split(videoFormatsGroup[i], sep2);
                  if (videoFormatsElem.Length<5) continue;
                  string[] partialResult1 = Regex.Split(videoFormatsElem[0], sep3);
                  if (partialResult1.Length<2) continue;
                  string url = partialResult1[1];
                  url = HttpUtility.UrlDecode(HttpUtility.UrlDecode(url));
                  string[] partialResult2 = Regex.Split(videoFormatsElem[4], sep3);
                  if (partialResult2.Length<2) continue;    
                  int itag = Convert.ToInt32(partialResult2[1]);
                  if (itag == 18){
                      link = url;
                  }
              }
          }
      

      最后一位itag==18根据这个选择质量

          {'5':'FLV 240p','18':'MP4 360p','22':'MP4 720p (HD)','34':'FLV 360p','35':'FLV 480p','37':'MP4 1080p (HD)','38':'MP4 4K (HD)','43':'WebM 360p','44':'WebM 480p','45':'WebM 720p (HD)','46':'WebM 1080p (HD)'};
      

      现在你可以对链接做任何你想做的事情,比如用 mediaplayerlauncher 或 mediaelement 打开它。就个人而言,我很想将它下载到独立存储并同时播放,但目前这似乎说起来容易做起来难。感谢您抽出宝贵的时间,很抱歉发了这么长的帖子。

      【讨论】:

      • 他忘记定义 flashvars,即在电影 html 页面中,只是一段文本,其中包含试图获取直接链接的有趣内容。如果您打开一个电影页面(youtube.com/watch?v=[id] 并检查源代码,您会注意到一个地方有一个名为 flashvars 的变量。您可以自行隔离它,然后从上面的代码中找到直接链接。
      • 需要写Regex rx = ...和MatchCollection match = ...并添加一个using System.Text.RegularExpressions; (无法编辑代码,因为我正在等待我发送的其他修复被处理)
      【解决方案4】:

      我相信你可以为 Windows Phone 调整它http://www.codeproject.com/KB/WPF/YouViewer.aspx

      【讨论】:

      • 不,这是行不通的,因为它假定您将能够在 Web 浏览器控件中播放 .swf 文件。这在 windows phone 中是不可能的
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-24
      • 1970-01-01
      相关资源
      最近更新 更多