我在 Windows azure 上托管了一些自适应流媒体视频,我注意到一开始视频以最低的可用比特率开始。这是一个大问题。
我通过搜索互联网看到一个技巧可以通过挂钩 manifestready 事件并删除最低比特率然后在一段时间后将它们添加回来来完成。这是有道理的,但我没有看到这样做的示例代码。
我从表达式编码器 4 中获得了播放器代码并查看了一下,但找不到在哪里进行更改。
有人有更多关于改善启动以实现流畅流媒体的信息吗?
非常感谢你
我在 Windows azure 上托管了一些自适应流媒体视频,我注意到一开始视频以最低的可用比特率开始。这是一个大问题。
我通过搜索互联网看到一个技巧可以通过挂钩 manifestready 事件并删除最低比特率然后在一段时间后将它们添加回来来完成。这是有道理的,但我没有看到这样做的示例代码。
我从表达式编码器 4 中获得了播放器代码并查看了一下,但找不到在哪里进行更改。
有人有更多关于改善启动以实现流畅流媒体的信息吗?
非常感谢你
您好,我将问题发布到媒体平台播放器论坛并得到了有效的答案。
讨论在这里: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 算法是为尽可能低的延迟启动而设计的——因此,在启动时使用最低比特率/视频块。但是,可以做你想做的事。
你需要做两件事,首先:
为玩家的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而不是 Expression Encoder Player - 它具有更高级的逻辑。
您可以手动删除服务器端的额外流(低质量流)(需要在那里编辑 xml 文件,而不仅仅是删除物理流文件),或者使用 IIS 提供工具来编辑流畅的流(假设您安装了相应的扩展,比如通过 Microsoft 平台安装程序应用程序)。您还可以使用 WinMerge 或类似工具来比较您在使用 MS 工具之前保留的剪辑文件夹的副本,以查看当您从平滑流中删除特定(子)流时它会发生什么变化(比较以前和新版本的.ism* 文件)
这也是有用的,因为有时玩家低估了客户端 CPU 和带宽(有一些自定义版本可以通过适当地预先编辑一些配置文件来修复 CPU 启发式问题)。也就是说,如果您有一些截屏视频,有时客户端无法获得足够质量的流来阅读文本,因此您必须删除质量较低的(子)流,然后才能正常播放(您开始删除较低质量的流,然后查看一个显示OK)。您还可以配置 TransformManager(或调用相应功能的代码)以不创建质量非常低的版本