IIS Smooth Streaming низкого качества при запуске - PullRequest
7 голосов
/ 25 августа 2011

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

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

Я получил код проигрывателя из кодировщика выражений 4 и посмотрел, но не нашел нигде, где внести изменения.

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

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

Ответы [ 4 ]

7 голосов
/ 05 сентября 2011

Здравствуйте! Я разместил вопрос на форуме 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);
            }
        }
    }
}

Спасибо

4 голосов
/ 25 августа 2011

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

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

0 голосов
/ 25 января 2014

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

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

0 голосов
/ 25 августа 2011

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

...