具有多个音频流的 Windows Phone 8 MediaStreamSource

Posted

技术标签:

【中文标题】具有多个音频流的 Windows Phone 8 MediaStreamSource【英文标题】:Windows Phone 8 MediaStreamSource with multiple audio streams 【发布时间】:2014-04-03 10:07:17 【问题描述】:

我有 MediaStreamSource 实现,它可以打开具有多个音频流的文件。在 OpenMediaAsync 方法中,我为所有视频和音频流提供 MediaStreamDescription,但 MediaElement 仅检测到 1 个音频流。我还测试了下一个有效的逻辑:

检测到 2 个流

仅将音频流的第一个或第二个 MediaStreamDescription 报告给 ReportOpenMediaCompleted

但我当然想向 ReportOpenMediaCompleted 报告第一个和第二个音频流,结果是具有 2 个音频流的 MediaElement。我还在 MediaStreamSource 类中发现了 StreamId 字段,但它没有设置访问器,并且当使用 ReportOpenMediaCompleted 报告流时,所有 MediaStreamDescription 的 StreamId == 0。

OpenMediaAsync 代码:

protected override void OpenMediaAsync()

    this.streamDesc = new Dictionary<int, MediaStreamDescription>();
    List<MediaStreamDescription> availableStreams = new List<MediaStreamDescription>();

    for (int i = 0; i < this.parser.StreamCount; i++)
    
        Dictionary<MediaStreamAttributeKeys, string> streamAttributes = new Dictionary<MediaStreamAttributeKeys, string>();
        MediaStreamDescription msd = null;

        var type = this.parser.GetStreamType(i);
        streamAttributes[MediaStreamAttributeKeys.CodecPrivateData] = this.parser.GetCodecPrivateData(i);

        if (type == ParserComponent.StreamType.Video)
        
            streamAttributes[MediaStreamAttributeKeys.VideoFourCC] = this.parser.GetCodecID(i);
            streamAttributes[MediaStreamAttributeKeys.Width] = this.parser.GetWidth(i).ToString();
            streamAttributes[MediaStreamAttributeKeys.Height] = this.parser.GetHeight(i).ToString();

            msd = new MediaStreamDescription(MediaStreamType.Video, streamAttributes);
        
        else if (type == ParserComponent.StreamType.Audio)
        
            msd = new MediaStreamDescription(MediaStreamType.Audio, streamAttributes);
        

        if (msd != null)
        
            if (i == this.parser.CurrentAudiostreamIndex || i == this.parser.CurrentVideoStreamIndex)
            
                this.parser.SetStreamActive(i, true);

                // quick fix for multilanguage videos to submit only 1 audio stream
                // availableStreams.Add(msd);
            

            this.streamDesc.Add(i, msd);
            availableStreams.Add(msd);
            
        

        Dictionary<MediaSourceAttributesKeys, string> sourceAttributes = new Dictionary<MediaSourceAttributesKeys, string>();

        sourceAttributes[MediaSourceAttributesKeys.CanSeek] = this.parser.Seekable.ToString();
        sourceAttributes[MediaSourceAttributesKeys.Duration] = this.parser.Duration.Ticks.ToString();

        ReportOpenMediaCompleted(sourceAttributes, availableStreams);

【问题讨论】:

【参考方案1】:

使用Player framework 可能是个好主意。它支持多种音频流。

【讨论】:

以上是关于具有多个音频流的 Windows Phone 8 MediaStreamSource的主要内容,如果未能解决你的问题,请参考以下文章

具有立体声或多个音频流的媒体流的音频持续时间的特定 mediainfo 命令

Windows Phone 8 录制扬声器音频

如何在Windows Phone 8中合并音频和视频[关闭]

使用 MediaElement 在 Windows Phone 8 上流式传输音频

当应用程序在后台时在 Windows phone 8 中播放音频通知

如何在 Windows Phone 8 应用程序中播放循环背景音频(不使用 BackroundAudio 服务)?