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

4
我正在尝试在Delphi XE7的TWebBrowser中加载YouTube视频,但是出现了以下错误:
需要Adobe Flash Player或支持HTML5的浏览器才能播放视频。
获取最新的Flash Player
了解更多关于升级到HTML5浏览器的信息
我可以正常加载普通的HTML。
我在此前发现的示例适用于旧版本的Delphi,因此我想知道这是否是较新版本、TWebBrowser或我的环境(VMWare 7和Windows 7)的问题。
编辑:我的目标很简单,就是能够从URL加载和播放视频,例如YouTube视频。除了TWebBrowser之外的其他解决方案也可以,特别是如果它们可以跨平台运行。

1
@DavidSchwartz: 默认情况下,即使您安装了IE11,嵌入式浏览器也会以IE6模式运行。如果您不想更改注册表键,则唯一的解决方法是修改网页(添加标签 <meta http-equiv="X-UA-Compatible" content="IE=edge" />)。 - whosrdaddy
1
嘿,责备 Microsoft,而不是我们?你可以从你的应用程序中写入HKCU密钥,所以这真的不是问题吗? - whosrdaddy
1
@JensBorrisholt 是的,我很想看一个例子。谢谢。 - David Schwartz
1
拜托,这不是 Delphi 组件,它是系统组件!!http://www.google.com/search?q=delphi+feature_browser_emulation - David Heffernan
1
IE包括对早期版本的兼容模式。因此,你可能会在IE7模式下获得IE11渲染。为什么你如此坚持认为自己知道得更好呢? - David Heffernan
显示剩余21条评论
2个回答

6
你想知道你遇到的问题是否与Delphi版本有关。WebBrowser控件是系统控件。Delphi版本并不相关,因为服务由底层系统提供。如果发生了任何变化,可能是You Tube传递视频的方式发生了变化。
如果您正在编写嵌入远程视频的HTML,则应按照You Tube的最新文档进行操作。不要使用过时的Delphi特定文章作为指南。请使用专门针对You Tube使用的最新技术的现代文章。
尽管您在问题中没有声明,但我有一种感觉,您正在使用旧的、可能已弃用的方法来嵌入You Tube视频。请像这里描述的那样使用iframe:http://www.w3schools.com/html/html_youtube.asp

Adobe Flash Player或支持HTML5的浏览器是播放视频所必需的。

在缺乏特定步骤的情况下,您的WebBrowser控件将使用传统的IE浏览器引擎。因此它不会有HTML5支持。而且,如果You Tube仍然准备提供Flash形式的视频,它可能甚至没有Flash支持。现在首选HTML5。这不仅因为现代浏览器默认支持它,而且无需安装第三方Flash插件。
一种选择使用现代HTML5浏览器与WebBrowser控件的方法是进行明确的注册表设置(浏览器特性仿真),并可能指定DOCTYPE。更多细节请参见这里:How to have Delphi TWebbrowser component running in IE9 mode?尽管该问题特别提到了IE9,但答案中的文档链接提供了其他IE版本的详细信息。
如果您无法控制HTML文档的内容,则需要使用上述方法。
另一方面,如果您控制HTML文档的内容,则还有另一种方法。
<meta http-equiv="X-UA-Compatible" content="IE=edge" />

作为您页面的第一项。edge的含义是IE的最新版本。如果您希望针对特定版本进行定位,例如IE9,则应使用:
<meta http-equiv="X-UA-Compatible" content="IE=9" />

这里有更多相关信息:

旧版本的IE不支持该标头,如果您需要为它们提供支持,则需要在注册表中实现浏览器特性仿真。感谢评论区中 @whosrdaddy 和 @TLama 的贡献,看起来 IE8 对 X-UA-Compatible 也做了支持。


1
David 是正确的。IE 行为与 Delphi 完全无关。我想 MS 有一些很好的理由,让 IE 默认运行在 IE7 模式下,如果你想改变这种行为,你必须玩弄注册表。 - iamjoosy
1
@DavidSchwartz:在Delphi下,Twebbrowser不过是IE webbrowser嵌入控件的包装组件(就像大多数VCL包装Microsoft的公共控件库一样)。 - whosrdaddy
1
@DavidSchwartz:如果您不同意微软的观点,并且不介意在应用程序中分发额外的DLL,您可以随时使用TChromium嵌入式框架 - whosrdaddy
2
@DavidHeffernan:在我看来,他已经控制了网页,添加元标记<meta http-equiv="X-UA-Compatible" content="IE=edge" />应该可以解决他的问题... - whosrdaddy
1
不是的,在这种情况下,是文档决定了浏览器模式。 - whosrdaddy
显示剩余9条评论

4

如前所述,我认为使用TWebBrowser是错误的方式,因为您对视频控制太少了。因此,您需要自己控制视频播放。

*** 注意 ****

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

*** 注意 ****

正如我向您承诺的那样,在此处提供了一个示例,演示如何在Wincontrol ex. TPanel上播放YouTube视频。

由于该示例包括用于解析YouTube URL的代码以及用于解析嵌入视频的YouTube页面的源代码的代码,因此我无法在此处发布完整的源代码。您需要从此处获取。

我将在此介绍我的示例的主要思路。

首先是最终结果的屏幕截图: enter image description 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是一个线程,它将获取请求的YouTube页面的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/TqCUV9tghttp://pastebin.com/WFGctwrf。您还需要一份SuperObject的副本。
或者,您可以在此处下载完整的工作示例:here

注释不是用于长时间讨论的;此对话已移至聊天室 - Taryn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接