平滑流媒体播放器 - 多音频轨道 - H.264 SmoothStreams

时间:2013-05-01 13:41:24

标签: .net silverlight silverlight-4.0 smooth-streaming smooth-streaming-player

我正在尝试开发基于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

任何人都可以帮助我如何在视频中检测当前播放的语言,然后我想放置一个事件处理程序或“用户更改语言的动作”,一旦该事件被触发,我想要更改当前播放所选音频曲目。

2 个答案:

答案 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中找到它的示例实现。