IIS在启动时平滑流式传输低质量

时间:2011-08-25 11:42:25

标签: silverlight silverlight-4.0 azure smooth-streaming-player

我在windows azure上托管一些自适应流媒体视频,我注意到在开始时视频以最低的可用比特率开始。这是一个大问题。

我通过搜索互联网已经看到,可以通过挂钩manifestready事件并删除最低比特率然后在一段时间后添加它们来完成一个技巧。 这很有意义,但我没有看到这样做的示例代码。

我从表达式编码器4获得了播放器代码并看了一眼,但发现无处可去做更改。

有人有更多关于改善平滑流媒体启动的信息吗?

非常感谢

4 个答案:

答案 0 :(得分:7)

您好我将问题发布到媒体平台播放器论坛并得到了有效的答案。

讨论在这里: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);
            }
        }
    }
}

谢谢

答案 1 :(得分:4)

正如提到的另一个答案,使用MMPPF(以前的Silverlight Media Framework)。功能更全面的播放器,相对容易定制(也有视频教程)。

对于比特率 - 是的,Smooth Streaming算法是为最低延迟启动而设计的 - 因此,启动时使用最低比特率/视频块。但是,可以做你想做的事。

首先需要做两件事:

为玩家的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的{​​{1}}上的方法。

例如:

SetVideoBitrateRange(...)

这应该可以满足您的需求。

答案 2 :(得分:0)

尝试使用Microsoft Media Platform: Player Framework代替Expression Encoder Player - 它具有更高级的逻辑。

答案 3 :(得分:0)

您可以手动删除服务器端的额外流(低质量流)(需要在那里编辑xml文件,而不仅仅是删除物理流文件),或者使用IIS提供编辑平滑流的工具(假设您安装了相应的扩展名,请通过Microsoft Platform安装程序应用程序说明)此外,您可以使用WinMerge或类似工具比较您在使用MS工具之前保留的剪辑文件夹的副本,以查看从平滑流中删除特定(子)流时更改的内容(比较之前和之后的新版本) .ism *文件)

这也是有用的,因为有时播放器会低估客户端CPU和带宽(有一些自定义版本可用于修复CPU启发式问题,通过适当预编辑一些配置文件)。也就是说,如果你有一些截屏视频,有时客户端没有足够的质量来阅读文本,所以你必须删除质量较低的(子)流,然后它才能正常播放(你开始删除较低的那些并看到之后一个它显示OK)。您还可以配置TransformManager(或调用相应功能的代码)以创建非常低质量的版本