IIS Smooth Streaming низкого качества при запуске
Я размещаю некоторые адаптивные потоковые видео на Windows Azure, и я заметил, что в начале видео начинается с самого низкого доступного битрейта. Это большая проблема.
По поиску в интернете я понял, что хитрость можно сделать, подключив событие manifestready и удалив самые низкие битрейты, а затем добавив их обратно через некоторое время. Это имеет смысл, но я не видел пример кода для этого.
Я получил код плеера от кодировщика выражений 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);
Это должно дать вам то, что вам нужно.
Вы можете удалить лишние потоки (низкокачественные) на стороне сервера либо вручную (нужно редактировать XML-файлы, а не просто удалять файлы физического потока), либо использовать IIS, который предоставляет возможность редактировать плавные потоки (при условии, что вы установлено соответствующее расширение, скажем, через установщик приложения Microsoft Platform). Также вы можете использовать WinMerge или аналогичный инструмент для сравнения копии папки клипа, которую вы сохранили перед использованием инструмента MS, чтобы увидеть, что она меняет при удалении определенного (под) потока из плавного потока (сравните предыдущую и новую версию файлы.ism *)
это также полезно, потому что иногда проигрыватель недооценивает клиентский ЦП и пропускную способность (есть несколько пользовательских версий, которые, как предполагается, решают проблему эвристики ЦП, если соответствующим образом отредактировать некоторый файл конфигурации). То есть, если у вас есть скринкаст, иногда клиент не получает поток достаточного качества для чтения текста, поэтому вы должны удалить (суб) потоки более низкого качества, а затем он воспроизводится нормально (вы начинаете удалять более низкие потоки и видите, после чего один это показывает ОК). Вы также можете настроить TransformManager (или ваш код, который вызывает соответствующие функции), чтобы не создавать версии очень низкого качества
Попробуйте использовать Microsoft Media Platform: Player Framework вместо Expression Encoder Player - в нем более продвинутая логика.