1

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

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

4

2 回答 2

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);
}
于 2013-05-03T20:16:34.610 回答
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事件被触发后调用。

注意:CultureInfo.ThreeLetterISOLanguageName()Silverlight 中不存在该方法。您可以在此答案中找到它的示例实现。

于 2013-08-14T10:02:52.893 回答