2016-05-09 8 views
0

私は、httpストリームからYouTube動画を再生するソリューションを見つけようとしています。埋め込みプレーヤーまたはウェブサイト経由ではありません。その理由は、埋め込まれることを防ぐアプリ内でローカルにクリップを再生する必要があるからです。 したがって、httpストリームを取得するための最初のタスクは簡単に解決できます。 YouTubeExtractorを使用してください。たとえば、このYouTubeのURLから https://www.youtube.com/watch?v=31crA53Dgu0抽出されたURLからYouTube動画をストリーム

YouTubeExtractorは、動画をダウンロードするためのURLを抽出します。あなたが見ることができるように、具体的な.mp4または.movファイルへのパスはありません。 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; 
    } 

このlibには以下のコードを使用してビデオをダウンロードします。興味深い瞬間は、ストリームを読んで、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はこれを簡単に実行します。ブラウザはビデオタグで簡単なページを生成するので、JSを通してプレイヤーを管理するのは簡単です。しかし、... WebBrowserの内部コントロールでは、ファイルをダウンロードすることはできません。私はCEFSharp(Chrome埋め込みフレームワーク)を試してみましたが、そこに運がありません。 多分、ストリーミングビデオができる良いビデオプレーヤーWPFライブラリを知っている人はいますか?私もVLC.wpfとShockwave Flashを試しましたが、この抽出されたURLにはまだ不満があります。検索はたくさんありますが、今は不十分です。

答えて

1

調査して2日後、私はWPFアプリケーションから直接youtube video urlを再生する方法の解決策を見つけました。 前の注意:

  • WinFormsのWebBrowserコンポーネントとHTMLフォームは、HTML5をサポートしていません。したがって、<ビデオ>タグを使用してビデオを再生する方法はありません
  • Chrome埋め込みフレームワーク(CEF)とそのCEFSharpラッパーは、デフォルトでは<オーディオ>と<ビデオ>タグをサポートしていません。私はだから、オーディオをサポートするためにCEFを再コンパイルする必要があり、それもビデオのようです。 --enable-multimedia-streamsオプションがビデオを再生するために私の側で全く機能しませんでした。
  • WPF MediaElementコンポーネントdoes not supportストリームからビデオを再生しています。しかし、workaroungが存在する、彼らはあなたのYouTubeのURLを再生するには不適切です。
  • んが、.NETのメディアプレーヤーは、HttpWebRequestの

によって返されたStreamオブジェクトからビデオを再生する可能性が見つからないので、解決策はnuget経由でも利用可能ですGeckoFxウェブブラウザを使用しています。 WinFormsベースのコンポーネントであるため、WPFで使用するにはWinFormsHostingを使用する必要があります。最終的な解決策は以下のとおりです。

<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にdepenededされます。それはしかし、ナゲットパッケージと一緒にインストールされます。この解決策の1つの短所は、すべてのアプリの依存関係のサイズが+ 70MBを超えて増加したことです。

関連する問題