Службы IIS гладкой потокового низкого качества на старт

Я размещаю некоторое адаптивное потоковое видео в Windows azure, и я заметил, что в начале видео начинается с самого низкого доступного битрейта. Это большая проблема.

Я видел, просматривая интернет, что трюк можно сделать, подключив событие manifestready и удалив самые низкие битрейты, а затем добавив их через некоторое время. Это имеет смысл, но я не видел примера кода этого.

Я получил код плеера от expression encoder 4 и посмотрел, но нигде не нашел, где сделать изменение.

есть ли у кого-то больше информации об улучшении запуска для плавной потоковой передачи?

большое спасибо

4 ответов


Привет я разместил вопрос на форуме 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);
            }
        }
    }
}

спасибо


Как упоминалось в другом ответе, используйте 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;
        }
    }

как только у вас это будет, дождитесь, пока одно из открытых событий мультимедиа загорится (MediaOpened или что-то еще), и теперь у вас будет доступ к методу на IAdaptiveMediaPlugin под названием SetVideoBitrateRange(...).

например:

_adaptivePlugin.SetVideoBitrateRange(minBitrate, maxBitrate, true);

это должно дать вам то, что вам нужно.


попробуйте использовать Microsoft Media Platform: Player Framework вместо игрока кодировщика выражения - он имеет более продвинутую логику.


вы можете удалить дополнительные потоки (низкого качества) на стороне сервера либо вручную (необходимо отредактировать xml-файлы там, а не просто удалить физические файлы потока), или использовать IIS, который предоставляет возможность редактировать гладкие потоки (при условии, что вы установили соответствующее расширение, скажем, через приложение установщика платформы Microsoft). Также Вы можете использовать WinMerge или аналогичный инструмент для сравнения копии папки клипа, которую вы сохранили перед использованием MS tool, чтобы увидеть, что она изменяется при удалении определенного (sub)потока из плавного потока (сравните предыдущую и новую версии .ism * files)

Это также полезно, потому что иногда игрок недооценивает клиентский процессор и пропускную способность (есть некоторые пользовательские версии, которые должны исправить проблему эвристики процессора, предварительно отредактировав файл конфигурации соответствующим образом). То есть, если у вас есть скринкаст, иногда клиент не получает поток достаточного качества для чтения текста, поэтому вам нужно удалить потоки более низкого качества (sub), а затем он отлично играет (вы начинаете удалять нижние и видите, после чего он показывает OK). Вы также можете настроить TransformManager (или ваш код, который вызывает соответствующую функциональность), чтобы не создавать версии очень низкого качества