7

Windows azure でアダプティブ ストリーミング ビデオをホストしていますが、最初はビデオが利用可能な最低のビットレートで始まることに気付きました。それは大きな問題です。

マニフェストレディ イベントをフックし、最低のビットレートを削除してから、しばらくしてからそれらを追加し直すことで、トリックを実行できることをインターネットで検索して見ました。理にかなっていますが、それを行うサンプルコードは見たことがありません。

エクスプレッション エンコーダー 4 からプレーヤー コードを取得し、確認しましたが、変更する場所が見つかりませんでした。

スムーズなストリーミングのためにスタートアップを改善することについて、誰かがより多くの情報を持っていますか?

どうもありがとうございました

4

4 に答える 4

7

こんにちは、Media Platform Player フォーラムに質問を投稿したところ、有効な回答が得られました。

ディスカッションはこちら: http://smf.codeplex.com/discussions/271042

私が使用するコードは次のとおりです。

public MainPage() {
        InitializeComponent();
        player.MediaPluginRegistered += new EventHandler<CustomEventArgs<IMediaPlugin>>(player_MediaPluginRegistered);
        player.PlayStateChanged += new EventHandler<CustomEventArgs<MediaPluginState>>(Player_PlayStateChanged);
    }
private IAdaptiveMediaPlugin _adaptivePlugin = null;
private bool isStartupHeuristicsActive = false;

void player_MediaPluginRegistered(object sender, CustomEventArgs<IMediaPlugin> e) {
    var adaptivePlugin = e.Value as IAdaptiveMediaPlugin;
    if (adaptivePlugin == null) return; 
    if (_adaptivePlugin == null) _adaptivePlugin = adaptivePlugin;
    _adaptivePlugin.ManifestReady +=new Action<IAdaptiveMediaPlugin>(_adaptivePlugin_ManifestReady);
}

void  _adaptivePlugin_ManifestReady(IAdaptiveMediaPlugin obj)
{
    if (_adaptivePlugin != null)
    {
        var videoStream = _adaptivePlugin.CurrentSegment.SelectedStreams.Where(i => i.Type == StreamType.Video).FirstOrDefault();

        if (videoStream != null)
        {
            var averageBitrate = videoStream.AvailableTracks.Average(t => t.Bitrate);

            var track = videoStream.AvailableTracks.FirstOrDefault(t => t.Bitrate >= averageBitrate);
            if (track != null)
            {
                isStartupHeuristicsActive = true;
                videoStream.SetSelectedTracks(new[] { track });
            }
        }
    }
}

private void Player_PlayStateChanged(object sender, CustomEventArgs<MediaPluginState> e)
{
    if (isStartupHeuristicsActive && e.Value == MediaPluginState.Playing)
    {
        isStartupHeuristicsActive = false;
        if (_adaptivePlugin != null)
        {
            var videoStream = _adaptivePlugin.CurrentSegment.SelectedStreams.Where(i => i.Type == StreamType.Video).FirstOrDefault();
            if (videoStream != null)
            {
                videoStream.SetSelectedTracks(videoStream.AvailableTracks);
            }
        }
    }
}

ありがとうございました

于 2011-09-05T12:26:21.700 に答える
4

他の回答が述べたように、MMPPF (以前の Silverlight Media Framework) を使用してください。より多くの機能を備えたプレーヤーであり、カスタマイズも比較的簡単です (ビデオ チュートリアルも使用可能)。

ビットレートについては、そうです。Smooth Streaming アルゴリズムは、開始時の遅延を可能な限り低くするように設計されているため、開始時に最も低いビットレート/ビデオ チャンクが使用されます。ただし、やりたいことは可能です。

まず、次の 2 つのことを行う必要があります。

プレーヤーのOnMediaPluginRegisteredイベントにハンドラーを追加します。IAdaptiveMediaPluginその場合は、プラグインのインスタンスが必要かどうかを確認してください。これがサンプルです...

    IAdaptiveMediaPlugin _adaptivePlugin = null;

    void OnMediaPluginRegistered(object sender, Microsoft.SilverlightMediaFramework.Core.CustomEventArgs<Microsoft.SilverlightMediaFramework.Plugins.IMediaPlugin> e)
    {
        var adaptivePlugin = e.Value as IAdaptiveMediaPlugin;

        if (adaptivePlugin == null) { return; }

        if (_adaptivePlugin == null)
        {
            _adaptivePlugin = adaptivePlugin;
        }
    }

それができたら、メディア オープン イベントの 1 つ (MediaOpened など) が発生するのを待ちます。これで、IAdaptiveMediaPlugin呼び出された のメソッドにアクセスできるようになりますSetVideoBitrateRange(...)

例えば:

_adaptivePlugin.SetVideoBitrateRange(minBitrate, maxBitrate, true);

それはあなたに必要なものを与えるはずです。

于 2011-08-25T16:09:08.753 に答える
0

Expression Encoder Player の代わりにMicrosoft Media Platform: Player Frameworkを使用してみてください。これには、より高度なロジックがあります。

于 2011-08-25T14:56:24.517 に答える
0

サーバー側で余分なストリーム(低品質のもの)を手動で削除するか(物理ストリームファイルを削除するだけでなく、xmlファイルを編集する必要があります)、スムーズなストリームを編集する機能を提供するIISを使用できます(たとえば、Microsoft プラットフォーム インストーラー アプリを使用して、それぞれの拡張機能をインストールします)。また、WinMerge または同様のツールを使用して、MS ツールを使用する前に保持していたクリップのフォルダーのコピーを比較して、スムーズ ストリームから特定の (サブ) ストリームを削除したときに何が変わるかを確認できます (以前のバージョンと新しいバージョンの.ism* ファイル)

これは、プレイヤーがクライアントの CPU と帯域幅を過小評価することがあるためにも役立ちます (いくつかの構成ファイルを適切に事前編集することにより、CPU ヒューリスティックの問題を修正することになっているカスタム バージョンがいくつか利用可能です)。つまり、スクリーンキャストがある場合、クライアントがテキストを読み取るのに十分な品質のストリームを取得できない場合があるため、低品質の (サブ) ストリームを削除する必要があり、その後正常に再生されます (低品質のストリームを削除し始めて、その後を確認します)。 1つはOKを示しています)。非常に低品質のバージョンを作成しないように、TransformManager (またはそれぞれの機能を呼び出すコード) を構成することもできます。

于 2014-01-25T19:06:00.673 に答える