В этой статье мы рассмотрим, как создать приложение на Delphi XE7 (VCL), которое позволит воспроизводить видео с YouTube, Vimeo, Dailymotion и других видеохостингов без отображения всей веб-страницы. Мы разберём решение, предложенное в обсуждении на форуме, и предложим альтернативные подходы.
Проблема и её решение
Как отметил пользователь JohnLM, стандартный компонент TWebBrowser в Delphi XE7 не подходит для этой задачи, так как он отображает всю веб-страницу YouTube, а не только видео. Кроме того, могут возникнуть проблемы совместимости со старыми версиями Windows (например, Windows 7).
Решение с WebView4Delphi
JohnLM нашёл решение с использованием компонента WebView4Delphi (TWVBrowser и TWVWindowParent). Вот как это работает:
Вместо прямой загрузки URL видео (например, https://www.youtube.com/watch?v=ZJhJILyS388) используется embed-версия (https://www.youtube.com/embed/ZJhJILyS388).
Для преобразования URL используется простая функция замены строки.
Пример кода:
procedure TMainForm.GoBtnClick(Sender: TObject);
var
url: string;
idx: integer;
begin
// Преобразование URL YouTube
url := StringReplace(addresscb.Text, 'watch?v=', 'embed/', [rfIgnoreCase]);
addressCb.Text := url;
WVBrowser1.Navigate(url);
// Добавление URL в список, если его там нет
idx := ComboBox1.Items.IndexOf(url);
if idx = -1 then
ComboBox1.Items.Add(url);
end;
Альтернативные решения
1. Использование YouTube API
Для более продвинутого управления воспроизведением можно использовать YouTube IFrame Player API. Вот пример кода, который встраивает плеер:
procedure TMainForm.EmbedYouTubeVideo(VideoID: string);
var
HTML: string;
begin
HTML :=
'<!DOCTYPE html>' +
'<html>' +
'<body>' +
' <iframe width="560" height="315" src="https://www.youtube.com/embed/' + VideoID +
'?autoplay=1" frameborder="0" allowfullscreen></iframe>' +
'</body>' +
'</html>';
// Для TWebBrowser
WebBrowser1.Navigate('about:blank');
while WebBrowser1.ReadyState < READYSTATE_INTERACTIVE do
Application.ProcessMessages;
if WebBrowser1.Document <> nil then
begin
WebBrowser1.Document.Write(HTML);
WebBrowser1.Document.Close;
end;
end;
2. Использование CEF4Delphi
CEF4Delphi (Chromium Embedded Framework) - это мощная альтернатива, которая предоставляет современный движок Chromium для Delphi. Пример использования:
procedure TMainForm.Chromium1LoadEnd(Sender: TObject; const browser: ICefBrowser;
const frame: ICefFrame; httpStatusCode: Integer);
begin
if frame.IsMain then
begin
// Встраивание видео после загрузки
frame.ExecuteJavaScript(
'document.body.innerHTML = ''<iframe width="560" height="315" ' +
'src="https://www.youtube.com/embed/' + FCurrentVideoID +
'" frameborder="0" allowfullscreen></iframe>'';',
'about:blank', 0);
end;
end;
Расширение функциональности
Автоматическое добавление URL из буфера обмена
Как предложил Die Holländer, можно автоматически добавлять URL из буфера обмена:
procedure TMainForm.Timer1Timer(Sender: TObject);
var
ClipText: string;
VideoID: string;
begin
if Clipboard.HasFormat(CF_TEXT) then
begin
ClipText := Clipboard.AsText;
if Pos('youtube.com/watch?v=', ClipText) > 0 then
begin
VideoID := Copy(ClipText, Pos('v=', ClipText) + 2, 11);
if ComboBox1.Items.IndexOf(VideoID) = -1 then
ComboBox1.Items.Add(VideoID);
end;
end;
end;
Обработка разных видеохостингов
Для поддержки разных видеохостингов можно создать функцию определения типа URL:
function TMainForm.GetVideoService(const URL: string): TVideoService;
begin
if Pos('youtube.com', URL) > 0 then
Result := vsYouTube
else if Pos('vimeo.com', URL) > 0 then
Result := vsVimeo
else if Pos('dailymotion.com', URL) > 0 then
Result := vsDailymotion
else
Result := vsUnknown;
end;
function TMainForm.GetEmbedURL(const URL: string): string;
var
Service: TVideoService;
VideoID: string;
begin
Service := GetVideoService(URL);
case Service of
vsYouTube:
begin
VideoID := Copy(URL, Pos('v=', URL) + 2, 11);
Result := 'https://www.youtube.com/embed/' + VideoID;
end;
vsVimeo:
begin
VideoID := Copy(URL, LastDelimiter('/', URL) + 1, MaxInt);
Result := 'https://player.vimeo.com/video/' + VideoID;
end;
vsDailymotion:
begin
VideoID := Copy(URL, Pos('/video/', URL) + 7, MaxInt);
VideoID := Copy(VideoID, 1, Pos('_', VideoID + '_') - 1);
Result := 'https://www.dailymotion.com/embed/video/' + VideoID;
end;
else
Result := URL;
end;
end;
Проблемы и их решения
Как отметил Lars Fosdal, некоторые видео могут не воспроизводиться из-за ограничений, установленных владельцами контента. В этом случае можно:
Попробовать использовать прямую ссылку на видео (если доступна)
Предложить пользователю открыть видео в браузере
Использовать YouTube Data API для проверки доступности видео
Заключение
Мы рассмотрели несколько подходов к созданию видеоплеера для YouTube и других сервисов в Delphi XE7. Основные варианты:
WebView4Delphi - современное решение для Windows 7 и выше
CEF4Delphi - мощный, но более ресурсоёмкий вариант
YouTube IFrame API - максимальный контроль над воспроизведением
Для простого приложения достаточно решения с WebView4Delphi и преобразованием URL в embed-формат. Для более сложных сценариев стоит рассмотреть CEF4Delphi или прямое использование API видеохостингов.
Пример полного кода приложения можно найти в демонстрационных проектах WebView4Delphi или CEF4Delphi.
Статья описывает создание приложения на Delphi XE7 для воспроизведения видео с YouTube и других видеохостингов с использованием различных подходов, включая WebView4Delphi, CEF4Delphi и YouTube API.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.