【问题标题】:Xamarin.forms new Media element not playing youtube videoXamarin.forms 新媒体元素不播放 youtube 视频
【发布时间】:2020-07-21 06:50:57
【问题描述】:

我正在实施 xamarin 表单媒体元素。我可以从 xamarin 媒体元素官方文档中提供的链接播放视频。但问题是我想播放 youtube 视频但它没有播放。我已经在 app.xaml.cs 中设置了标志,但 youtube 视频仍然没有发生任何事情。它只在模拟器和物理设备中显示空白屏幕。

<MediaElement Source="https://youtu.be/E7Voso411Vs" x:Name="mediaSource"
                          AutoPlay="True" ShowsPlaybackControls="True" 
                          VerticalOptions="FillAndExpand" />

希望得到解决。
谢谢。

【问题讨论】:

  • 该 YT 链接是基于网络的视频播放器,而不是直接视频链接。请改用WebView

标签: asp.net xamarin xamarin.forms xamarin.android xamarin.ios


【解决方案1】:

你应该先用https://www.youtube.com/get_video_info?video_id={VideoId}从youtube中提取url,试试这个:

<MediaElement  x:Name="mediaSource"
             AutoPlay="True" ShowsPlaybackControls="True" 
             VerticalOptions="FillAndExpand" />

然后在你的 page.cs 中:

public MediaElem()
    {
        InitializeComponent();

        mediaSource.Source = GetYouTubeUrl("E7Voso411Vs");

    }



public string GetYouTubeUrl(string videoId)
    {
        var videoInfoUrl = $"https://www.youtube.com/get_video_info?video_id={videoId}";
        using (var client = new HttpClient())
        {
            var videoPageContent = client.GetStringAsync(videoInfoUrl).Result;
            var videoParameters = HttpUtility.ParseQueryString(videoPageContent);
            var encodedStreamsDelimited1 = WebUtility.HtmlDecode(videoParameters["player_response"]);
            JObject jObject = JObject.Parse(encodedStreamsDelimited1);
            string url = (string)jObject["streamingData"]["formats"][0]["url"];
            return url;           
        }
    }

【讨论】:

  • 将 HttpClient 包装在“使用”块中不被视为反模式吗?
  • 对于这个例子,没问题。如果您尝试获取 50 个 youtube 视频的 URL,那么是的,您可能不想每次都创建一个新的 HttpClient。
【解决方案2】:

是的,你不能直接玩。首先,您必须将该 youtube 视频 url 转换为流,您可以使用 YoutubeExplode plugin

var videoId = (string)parameters["videoId"];
var videoURL = $"https://www.youtube.com/watch?v={videoId}";
var youtube = new YoutubeClient();

var streamManifest = await youtube.Videos.Streams.GetManifestAsync(videoId);
var streamInfo = streamManifest.GetMuxed().WithHighestVideoQuality();

if (streamInfo != null)
{
    // Get the actual stream
    var stream = await youtube.Videos.Streams.GetAsync(streamInfo);
    var source = streamInfo.Url;

   // Then use it with MediaElement
   mediaSource.Source = source; 
}

【讨论】:

  • 如果您传递 URL,则不需要 stream。但值得注意的是 YoutubeExplode 返回的流对象非常复杂,所以如果可能的话,你会希望在 URL 上使用它,因为它会处理很多事情。
  • 我在使用最新版本的 lib 时在 xamrain 表单中找不到 GetMuxed
猜你喜欢
  • 2014-09-27
  • 1970-01-01
  • 1970-01-01
  • 2020-01-15
  • 2011-05-28
  • 2012-11-20
  • 2012-12-06
  • 1970-01-01
相关资源
最近更新 更多