0

我刚开始在 UWP 中试验 MediaStreamSource。我从 MS 中获取了MediaStreamSource 流示例,并尝试重写它以支持 mp4 而不是 mp3。我只改变了InitializeMediaStreamSource部分,现在看起来像这样:

{
    var clip = await MediaClip.CreateFromFileAsync(inputMP3File);
    var audioTrack = clip.EmbeddedAudioTracks.First();
    var property = clip.GetVideoEncodingProperties();

    // initialize Parsing Variables
    byteOffset = 0;
    timeOffset = new TimeSpan(0);

    var videoDescriptor = new VideoStreamDescriptor(property);
    var audioDescriptor = new AudioStreamDescriptor(audioTrack.GetAudioEncodingProperties());

    MSS = new MediaStreamSource(videoDescriptor)
    {
        Duration = clip.OriginalDuration
    };

    // hooking up the MediaStreamSource event handlers
    MSS.Starting += MSS_Starting;
    MSS.SampleRequested += MSS_SampleRequested;
    MSS.Closed += MSS_Closed;

    media.SetMediaStreamSource(MSS);
}    

我的问题是,我找不到使用视频流代替音频的单个示例,因此我无法弄清楚我的代码有什么问题。如果我将 MediaElement 的 Source 属性设置为给定的 mp4 文件,它就像一个魅力。如果我选择一个 mp3 并将 videoDescriptor 也排除在外。但是,如果我尝试对视频做同样的事情(我仍然不确定是否应该将 audioDescriptor 作为第二个参数添加到 MediaStreamSource,但因为我有一个混合流,我想它是不需要的) ,然后什么也没有发生。SampleRequested 事件被触发。没有错误被抛出。调试它真的很难,真的很痛苦。:S

4

1 回答 1

0

我有从文件位图构建工作视频 MediaStreamSource 的解决方案,但不幸的是还没有找到 RGBA 缓冲区的解决方案。首先阅读 MediaStreamSource 类文档https://docs.microsoft.com/en-us/uwp/api/windows.media.core.mediastreamsource 我正在创建 MJPEG MediaStreamSource

var MediaStreamSource = new MediaStreamSource(
                new VideoStreamDescriptor(
                    VideoEncodingProperties.CreateUncompressed(
                        CodecSubtypes.VideoFormatMjpg, size.Width, size.Height
                    )
                )
            );

然后初始化一些缓冲时间

MediaStreamSource.BufferTime = TimeSpan.FromSeconds(1);

然后订阅事件以设置请求的帧。

MediaStreamSource.SampleRequested += async (MediaStreamSource sender, MediaStreamSourceSampleRequestedEventArgs args) =>
            {
                var deferal = args.Request.GetDeferral();
                try
                {
                    var timestamp = DateTime.Now - startedAt;

                    var file = await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFileAsync(@"Assets\grpPC1.jpg");
                    using (var stream = await file.OpenReadAsync())
                    {
                        args.Request.Sample = await MediaStreamSample.CreateFromStreamAsync(
                            stream.GetInputStreamAt(0), (uint)stream.Size, timestamp);
                    }
                    args.Request.Sample.Duration = TimeSpan.FromSeconds(5);
                }
                finally
                {
                    deferal.Complete();
                }
            };

正如您在我的示例中看到的那样,我使用 CodecSubtypes.VideoFormatMjpg 和我永久用作 MediaStreamSample 的 jpeg 文件的硬编码路径。我们需要研究设置哪些 CodecSubtypes 以使用 RGBA(每像素 4 字节)格式位图,如 Thin

var buffer = new Windows.Storage.Streams.Buffer(size.Width * size.Height * 4);
// latestBitmap is SoftwareBitmap
latestBitmap.CopyToBuffer(buffer);
args.Request.Sample = MediaStreamSample.CreateFromBuffer(buffer, timestamp);
于 2018-03-21T23:03:05.757 回答