如何在较新版本的 Delphi 中嵌入 YouTube 视频?

Posted

技术标签:

【中文标题】如何在较新版本的 Delphi 中嵌入 YouTube 视频?【英文标题】:How to embed YouTube videos in newer versions of Delphi? 【发布时间】:2015-08-14 12:17:29 【问题描述】:

我正在尝试将 YouTube 视频加载到 Delphi XE7 中的 TWebBrowser 中,但我收到一条错误消息:

视频播放需要 Adob​​e Flash Player 或支持 html5 的浏览器。获取最新的 Flash Player 详细了解如何升级到 HTML5 浏览器

我可以正常加载正常的 HTML。

我发现之前在这里发布的示例是针对旧版本的 Delphi,所以我想知道这是否是新版本或 TWebBrowser 或我的环境中的某些东西(VMWare 7 和 Windows 7)的问题。

编辑:我的目标只是能够从 URL 加载和播放视频,例如 YouTube 视频。 TWebBrowser 以外的解决方案都很好,特别是如果它们可以跨平台运行。

【问题讨论】:

@DavidSchwartz:默认情况下,嵌入式浏览器以 IE6 模式运行,即使您安装了 IE11。如果您不想更改注册表项,那么摆脱此问题的唯一方法是修改网页(添加标签<meta http-equiv="X-UA-Compatible" content="IE=edge" /> 嘿怪microsoft,不是我们吗?而且你可以从你的应用程序中写入 HKCU 的密钥,这样真的没问题吗? @JensBorrisholt 是的,我很想看一个例子。谢谢。 看在上帝的份上,这不是delphi组件,而是系统组件!! google.com/search?q=delphi+feature_browser_emulation IE 包含早期版本的兼容模式。所以你会在 IE7 模式下获得 IE11 渲染,比如说。为什么你这么坚持要知道得更多? 【参考方案1】:

您想知道您的问题是否与 Delphi 版本有关。那么 WebBrowser 控件是一个系统控件。 Delphi 版本不相关,因为该服务由底层系统提供。如果有任何变化,那很可能是 You Tube 提供视频的方式。

如果您正在制作嵌入远程视频的 HTML,那么您应该按照 You Tube 的最新文档了解如何完成。不要使用多年前的 Delphi 特定文章作为您的指南。使用特定于 You Tube 使用的最新技术的现代文章。

我确实有一种感觉,尽管您没有在问题中这么说,但您正在使用一种旧的且可能已弃用的方法来嵌入 YouTube 视频。使用此处描述的 iframe:http://www.w3schools.com/html/html_youtube.asp


视频播放需要 Adob​​e Flash Player 或支持 HTML5 的浏览器。

如果您没有采取其他特定步骤,您的 WebBrowser 控件将使用旧版 IE 浏览器引擎。所以它不会有 HTML5 支持。也许甚至不支持 Flash,也就是说,如果 You Tube 仍然准备将视频作为 Flash 提供。现在首选HTML5。尤其是因为现代浏览器开箱即用地支持它,并且不需要安装第三方 Flash 插件。

选择使用带有 WebBrowser 控件的现代 HTML5 浏览器的一种方法是进行显式注册表设置(浏览器功能模拟),并可能指定 DOCTYPE。更多细节在这里:How to have Delphi TWebbrowser component running in IE9 mode? 虽然该问题专门询问 IE9,但答案中的文档链接提供了其他 IE 版本的详细信息。

如果您无法控制 HTML 文档,则需要使用上述方法。

另一方面,如果您确实控制了 HTML 文档的内容,那么还有另一种方法。你可以放这个

<meta http-equiv="X-UA-Compatible" content="IE=edge" />

作为页面&lt;head&gt; 中的第一项。 edge的意思是IE的最新版本。如果您希望针对特定版本,例如IE9 那么你会使用:

<meta http-equiv="X-UA-Compatible" content="IE=9" />

更多信息在这里:

https://msdn.microsoft.com/en-us/library/ms533876.aspx https://www.modern.ie/en-gb/performance/how-to-use-x-ua-compatible How to put the WebBrowser control into IE9 into standards?

旧版本的 IE 不支持此标头,如果您需要满足它们,那么您将返回注册表中的浏览器功能仿真。感谢 cmets 中的@whosrdaddy 和@TLama,IE8 似乎引入了对X-UA-Compatible 的支持。

【讨论】:

正如我在回答中所解释的,这是一个系统组件。 Delphi 在这里不相关。我已经链接到组件的文档。我建议您阅读该文档和我的答案,而不是生气。我不喜欢这种交流,也不喜欢你的态度。 大卫是对的。 IE 行为与 Delphi 完全无关。我想 MS 有一些很好的理由让 IE 默认在 IE7 模式下运行,如果你想改变这种行为,你必须摆弄注册表 @DavidSchwartz:Delphi 下的 Twebbrowser 只不过是 IE webbrowser 嵌入式控件的包装组件(就像大多数 VCL 包装 Microsoft's common control library) @DavidSchwartz:如果您不同意微软的意见并且不介意在您的应用程序中分发额外的 DLL,您可以随时使用TChromium embedded framework @DavidHeffernan:在我看来他控制了网页,添加元标记&lt;meta http-equiv="X-UA-Compatible" content="IE=edge" /&gt;应该可以解决他的问题...【参考方案2】:

如前所述,我相信使用 TWebBrowser 是错误的做法,因为您几乎无法控制视频。因为这样您就可以控制自己的视频播放了。

***注意****

直接流式传输 YouTube 视频违反了服务条款

***注意****

正如我向你承诺的那样,我在这里做了一个示例,说明如何在 Wincontrol ex 上播放 youtube 视频。面板。

由于该示例包含用于解析 youtube URL 的代码和用于解析嵌入视频的 youtube 页面的源代码的代码,因此我无法在此处发布完整的源代码。你必须从这个链接here

我将在这里介绍我的示例的主要思想。

首先是最终结果的截图:

首先要做的是导入 WindowsMediaPlayer 系统组件(不要与 Delphi 附带的组件混淆)并将 WMPLib_TLB.pas 与项目源代码一起保存。

下一步是声明该类的私有实例:

WindowsMediaPlayer:TWindowsMediaPlayer;

在formCreate中,创建一个实例并设置它:

procedure TMainform.FormCreate(Sender: TObject);
begin
  WindowsMediaPlayer := TWindowsMediaPlayer.Create(Panel2);
  WindowsMediaPlayer.Parent := Panel2;
  WindowsMediaPlayer.Align := TAlign.alClient;
  WindowsMediaPlayer.Visible := True;
  WindowsMediaPlayer.Settings.AutoStart := True;
  WindowsMediaPlayer.uiMode := 'none';

  with TYoutubeThread.Create('https://www.youtube.com/watch?v=7vkYiCdn834') do
    OnTerminate := YoutubeThreadTerminate;
end;

下一步是创建一个TYoutubeThreadTYoutubeThread 是一个线程,它将获取请求的 youtubepage 的 HTML 源代码并对其进行解析,以获取有关嵌入视频的信息。该线程的源代码可在完整示例中找到。

当线程终止时,我们需要设置 GUI:

procedure TMainform.YoutubeThreadTerminate(Sender: TObject);
var
  YoutubeThread: TYoutubeThread;
begin
  YoutubeThread := Sender as TYoutubeThread;
  if YoutubeThread = nil then
    exit;

  //The information list are sorted my number of pixels in the video
  FInformation := YoutubeThread.Youtube.Informations.Last;

  Caption := Format('%s %s (%dx%d)', [YoutubeThread.Youtube.Title, FInformation.Quality, FInformation.Size.cx, FInformation.Size.cy]);
  Panel1.Visible := True;
  Width := FInformation.Size.cx + 50;
  Height := FInformation.Size.cy + Panel1.Height + 50;
  WindowsMediaPlayer.URL := FInformation.VideoLink;

  TrackBar1.Max := 0;
end;

我省略了两个单元,可以在这里下载它们http://pastebin.com/TqCUV9tg 在这里http://pastebin.com/WFGctwrf。你还需要一份SuperObject

或者你可以下载完整的工作示例here

【讨论】:

评论不用于扩展讨论;这个对话是moved to chat。

以上是关于如何在较新版本的 Delphi 中嵌入 YouTube 视频?的主要内容,如果未能解决你的问题,请参考以下文章

如何在较新版本的打字稿中处理打字稿错误 Object.ts (7053)?

为啥在较新版本的 Keycloak 中不允许使用身份验证流程中的脚本

SVG sprite 图标背景位置在较新版本的 Chrome 中显示为关闭

在较新版本的 Keras 中,LSTM 等效于 return_sequence = True

在较新版本的 JSF 中,@FacesValidator 和 @FacesConverter 中的 EJB 和 CDI 注入点无法通过 OmniFaces 工作

React Native 图像未在较新版本的 iOS 上呈现