中堅プログラマーの備忘録

忘れっぽくなってきたので備忘録として・・・

C#.netでVLCを使ったストリーミングアプリケーションを作成する。(RTSP)

開発環境:visual studio2015
開発言語:C#.net

1.準備

下準備としてVLC公式サイトから下記をダウンロードしインストールしておきます。
https://www.videolan.org/vlc/download-windows.ja.html

2.【Vlc.DotNet.Forms】の設定

①【visual studio】でプロジェクトを作成し
 【ツール】→【Nugetパッケージマネージャー】→【ソリューションのNugetパッケージの管理】を選択
f:id:tsu--kun:20190613104505p:plain



②検索ボックスに【VLC】と入力すると【Vlc.DotNet.Forms】があるのでこれを選択し【インストールする】
f:id:tsu--kun:20190613104516p:plain



③【ツールボックス】タブを右クリックから、【アイテムの選択】をクリックする。
 【ツールボックスアイテムの選択】ウィンドウが表示されるので
 【.net Frameworkコンポーネント】タブにある【参照】ボタンをクリックする。
 【ファイル選択ダイアログ】が表示されるので、今回作成したプロジェクトフォルダから
 【Vlc.DotNet.Forms.dll】を選択する。
 私の環境では【../packages/Vlc.DotNet.Forms.3.0.0/lib/net40】にありました。
 f:id:tsu--kun:20190613104529p:plain
 
 
 
④【VlcControl】が追加されるのでフォームに貼り付けます。
f:id:tsu--kun:20190613104553p:plain


3.スクリプト

スクリプトは下記のとおり
 ストリーミングのテストとして下記を使わせてもらいました。
 【rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov】

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace vlcPlayer
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            vlcControl1.Play(new Uri("rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov"));

        }

        private void vlcControl1_VlcLibDirectoryNeeded(object sender, Vlc.DotNet.Forms.VlcLibDirectoryNeededEventArgs e)
        {
            e.VlcLibDirectory = new System.IO.DirectoryInfo(@"C:\Program Files (x86)\VideoLAN\VLC");
        }
    }
}

4.結果

無事ストリーミング再生できることが確認出来ました。
f:id:tsu--kun:20190614160039p:plain



結構簡単に出来たと思った矢先問題発生!
ネットワーク状態によって接続が切れた場合
勝手に再接続はしてくれないようです。
運用上、人の操作が難しいためそこは自動でやってくれないと・・・

ステータスチェンジのイベントがあればいいのですが
見た感じなさそうだし、ドキュメントも不親切だしで
どうしようか悩んだ結果
Timerでポーリングすることにしました。

【vlc】のステータスは下記のとおり変化するようです。
①デフォルト状態:NothingSpecial
②接続開始:Opening
③ストリーミング中:Playing
④接続が切れる:Ended

で、接続が切れたときに再度再生開始とするようにしました。

private void timer1_Tick(object sender, EventArgs e)
{
    if (vlcControl1.State == Vlc.DotNet.Core.Interops.Signatures.MediaStates.Ended)
    {
        vlcControl1.Play(new Uri("rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov"));
    }
}