首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MediaStreamSource视频流在UWP中的应用

MediaStreamSource视频流在UWP中的应用
EN

Stack Overflow用户
提问于 2018-01-09 17:13:04
回答 1查看 2.6K关注 0票数 0

我刚刚开始在UWP中使用MediaStreamSource进行实验。我从MS获得了MediaStreamSource流示例,并试图重写它以支持mp4而不是mp3。我只更改了InitializeMediaStreamSource部分,现在看起来如下:

代码语言:javascript
复制
{
    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作为第二个arg添加到MediaStreamSource中,但是因为我有一个混合流,所以我想它是不需要的),那么什么都不会发生。触发SampleRequested事件。没有抛出错误。它真的很难调试,这是一个非常痛苦的屁股。:S

EN

回答 1

Stack Overflow用户

发布于 2018-03-21 23:03:05

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

代码语言:javascript
复制
var MediaStreamSource = new MediaStreamSource(
                new VideoStreamDescriptor(
                    VideoEncodingProperties.CreateUncompressed(
                        CodecSubtypes.VideoFormatMjpg, size.Width, size.Height
                    )
                )
            );

然后初始化一些缓冲时间。

代码语言:javascript
复制
MediaStreamSource.BufferTime = TimeSpan.FromSeconds(1);

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

代码语言:javascript
复制
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和硬编码路径到jpeg文件,并将其永久用作MediaStreamSample。我们需要研究要设置哪个CodecSubtypes来使用RGBA (每像素4字节)格式的位图,比如瘦。

代码语言:javascript
复制
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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48173407

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档