0

複数のオーディオストリームでファイルを開くことができる MediaStreamSource 実装があります。OpenMediaAsync メソッドでは、すべてのビデオおよびオーディオ ストリームに MediaStreamDescription を配信しますが、MediaElement は 1 つのオーディオ ストリームしか検出しません。また、動作する次のロジックをテストしました:

  • 2 つのストリームを検出

  • オーディオ ストリームの最初または 2 番目の MediaStreamDescription のみを ReportOpenMediaCompleted に報告する

しかしもちろん、1 番目と 2 番目のオーディオ ストリームを 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);
}
4

1 に答える 1

0

Player フレームワークを使用することをお勧めします。複数のオーディオストリーミングをサポートしています。

于 2014-04-07T13:21:37.890 に答える