gpt4 book ai didi

wpf - 从提取的 URL 流式传输 YouTube 视频

转载 作者:行者123 更新时间:2023-12-03 05:56:42 29 4
gpt4 key购买 nike

我正在尝试找到从 http 流播放 YouTube 视频的解决方案。不是嵌入式播放器或通过网站。原因是我需要在应用程序中本地播放一些阻止嵌入的剪辑。
所以获取http流的第一个任务很容易解决,例如使用 YouTubeExtractor .例如来自这个 youtube 网址
https://www.youtube.com/watch?v=31crA53Dgu0

YouTubeExtractor 提取此类 url 以下载视频。如您所见,没有具体的 .mp4 或 .mov 文件的路径。还绑定(bind)到 IP,所以 url 对你不起作用。

https://r3---sn-puu8-3c2e.googlevideo.com:443/videoplayback?sparams=dur,gcr,id,initcwndbps,ip,ipbits,itag,lmt,mime,mm,mn,ms,mv,pl,ratebypass,requiressl,source,upn,expire&source=youtube&initcwndbps=3147500&pl=19&upn=oYYkSNBwoc8&fexp=9412913,9416126,9416891,9422596,9428398,9429016,9431012,9431364,9431901,9432206,9432825,9433096,9433424,9433623,9433946,9434085,9435504,9435703,9435937&id=o-AGanAaajMgOmp4VrXIwo9jewJnqlsvZecDxCcRpSN3lS&expire=1462821352&gcr=ua&ip=12.34.56.149&lmt=1458705532562546&ms=au&mt=1462799507&mv=m&dur=217.849&sver=3&itag=22&key=yt6&mn=sn-puu8-3c2e&mm=31&ipbits=0&mime=video/mp4&ratebypass=yes&requiressl=yes&signature=A142619EBA90D00CC46FF05B9CF1E3469B0EF196.072B532670A4D833582F94CF9C46F1F7D298F230&fallback_host=tc.v1.cache5.googlevideo.com

private string ExtractVideoUrl(string youtubeUrl)
{
IEnumerable<VideoInfo> videoInfos = DownloadUrlResolver.GetDownloadUrls(youtubeUrl, false);
var video = videoInfos.First();
if (video.RequiresDecryption)
{
DownloadUrlResolver.DecryptDownloadUrl(video);
}

return video.DownloadUrl; // videoInfos.First().DownloadUrl;
}

然后下载视频这个库使用下面的代码。有趣的时刻是读取流和写入 youtube 视频的内​​容。
var request = (HttpWebRequest)WebRequest.Create(this.Video.DownloadUrl);
if (this.BytesToDownload.HasValue)
{
request.AddRange(0, this.BytesToDownload.Value - 1);
}

// the following code is alternative, you may implement the function after your needs
using (WebResponse response = request.GetResponse())
{
using (Stream source = response.GetResponseStream())
{
**// HOW to Play source stream???**
using (FileStream target = File.Open(this.SavePath, FileMode.Create, FileAccess.Write))
{
var buffer = new byte[1024];
bool cancel = false;
int bytes;
int copiedBytes = 0;

while (!cancel && (bytes = source.Read(buffer, 0, buffer.Length)) > 0)
{
target.Write(buffer, 0, bytes);
....

所以一般的问题是如何从该开放流中播放视频? 例如 Chrome、Firefox 和 KMPlayer 很容易做到这一点。浏览器生成一个带有video标签的简单页面,因此通过JS管理播放器将是微不足道的。但是...内部WebBrowser控件不能,它建议下载文件。我试过 CEFSharp (Chrome 嵌入式框架)并没有运气。 也许有人知道可以流式传输视频的优秀视频播放器 WPF 库吗? 我也试过 VLC.wpf和 Shockwave Flash,但仍然对这个提取的 URL 不满意。大量搜索,但目前结果不足。

最佳答案

经过 2 天的研究,我找到了如何直接从 WPF 应用程序播放 youtube 视频 url 的解决方案。
之前的一些笔记:

  • WPF 和 WinForms 的 WebBrowser 组件不支持 HTML5。所以无法使用
  • Chrome 嵌入式框架 (CEF) 及其 CEFSharp 包装器默认不支持
  • WPF MediaElement 组件 does not support从流中播放视频。但是存在工作方法,它们不适合播放 youtube url。
  • 没有找到可以播放来自 HttpWebRequest
  • 返回的 Stream 对象的视频的 .NET 媒体播放器

    所以解决方案是使用 GeckoFx也可通过 nuget 获得的网络浏览器.由于它是基于 WinForms 的组件,因此需要使用 WinFormsHosting在 WPF 中使用它。最终解决方案是:
    <xmlns:gecko="clr-namespace:Gecko;assembly=Geckofx-Winforms">
    ....
    <WindowsFormsHost Width="400" Height="300" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" >
    <gecko:GeckoWebBrowser x:Name="_geckoBrowser"/>
    </WindowsFormsHost>

    和简单的代码使用:
    public void PlayVideo(string videoId)
    {
    var url = string.Format("https://www.youtube.com/watch?v={0}", videoId);
    var videoUrl = ExtractVideoUrl(url);

    _geckoBrowser.Navigate(videoUrl);
    }

    GeckoFx 依赖于 XulRunner 运行时 sdk。虽然它是用 nuget 包安装的。此解决方案的一个缺点是所有应用程序依赖项的大小增加了超过 70mb。

    关于wpf - 从提取的 URL 流式传输 YouTube 视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37117625/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com