我正在尝试开发基于SmoothStreamingMediaElement的silverlight播放器。 对于参考: SSME:SmoothStreamingMediaElement Grid.Row =“2”x:Name =“medSmooth”AutoPlay =“True”MinWidth =“320”MinHeight =“240”“
现在,使用H.264视频编解码器和AAC作为音频编解码器对源平滑流进行编码。 我在下面的URL中发现,audiostreamindex和audiostreamcount属性仅适用于WMV类型,这使我唯一的左希望死亡。 http://msdn.microsoft.com/en-us/library/microsoft.web.media.smoothstreaming.smoothstreamingmediaelement_properties(v=vs.90).aspx
任何人都可以帮助我如何在视频中检测当前播放的语言,然后我想放置一个事件处理程序或“用户更改语言的动作”,一旦该事件被触发,我想要更改当前播放所选音频曲目。
答案 0 :(得分:3)
我建议使用Silverlight Media Framework,它确实简化了视频应用程序的开发。您可以在此处下载其源代码:http://smf.codeplex.com/downloads/get/386528。
但是,你可以在没有框架的情况下做一些事情
以下是代码:
var currentSegment = mediaElement.ManifestInfo.Segments[mediaElement.CurrentSegmentIndex.Value];
var currentAudioStream = currentSegment.SelectedStreams.Where(i => i.Type == MediaStreamType.Audio).FirstOrDefault()
这样的事情:
foreach (var segment in mediaElement.ManifestInfo.Segments)
{
var newStreams = new List<StreamInfo>();
// use current video streams
var selectedVideoStreams = segment.SelectedStreams.Where(i => i.Type != MediaStreamType.Audio).ToList();
newStreams.AddRange(selectedVideoStreams);
// add a new audio stream
newStreams.Add(newAudioStream);
// replace old streams by new ones
segment.SelectStreamsAsync(newStreams);
}
答案 1 :(得分:2)
如果您使用SMF,这是最简单的解决方案:
private CustomPlayer SetAudioStreamLanguage(string languageCode)
{
const string languageAttributeKey = "Language";
if (AvailableAudioStreams.Count() < 2) return this;
var languageCode = new CultureInfo(languageCode).ThreeLetterISOLanguageName();
if (languageCode == null)
{
throw new Exception(string.Format("Audio stream language code {0} cannot be converted to three-letter ISO language code.", languageCode));
}
StreamMetadata newAudioStream =
AvailableAudioStreams.FirstOrDefault(
s =>
s.Attributes.ContainsKey(languageAttributeKey) &&
s.Attributes[languageAttributeKey].Equals(languageCode, StringComparison.InvariantCultureIgnoreCase));
if (newAudioStream == null) return this;
SelectedAudioStream = newAudioStream;
return this;
}
应在MediaOpened事件被触发后调用此方法。
注意:Silverlight中不存在CultureInfo.ThreeLetterISOLanguageName()
方法。您可以在this answer中找到它的示例实现。