微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从Windows.Media.Core.MediaSource访问原始音频/视频帧

如何解决从Windows.Media.Core.MediaSource访问原始音频/视频帧

我想在没有Windows.Media.Core.MediaSource的控制台应用程序中使用MediaPlayer。相反,我只想将源设置为mp4流,然后获取原始音频和视频样本。

下面是我的代码,该代码可以加载MediaSource,但是我看不到如何请求音频和视频样本?有一个mediastreamsource属性,但始终为null

using System;
using System.IO;
using System.Runtime.InteropServices;
using System.Threading.Tasks;
using Windows.Media.Capture.Frames;
using Windows.Media.Core;
using Windows.Media.MediaProperties;
using Windows.Media.Playback;

namespace ConsoleApp7
{
    [ComImport]
    [Guid("5B0D3235-4DBA-4D44-865E-8F1D0E4FD04D")]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnkNown)]
    unsafe interface IMemoryBufferByteAccess
    {
        void GetBuffer(out byte* buffer,out uint capacity);
    }

    class Program
    {
        static async Task Main(string[] args)
        {
            var fs = File.Open("big_buck_bunny.mp4",FileMode.Open);

            var mp4Src = Windows.Media.Core.MediaSource.CreateFromStream(fs.AsRandomAccessstream(),"video/mp4");
            await mp4Src.OpenAsync();
            Console.WriteLine($"state {mp4Src.State},duration {mp4Src.Duration},isopen {mp4Src.IsOpen},has source {mp4Src.MseStreamSource}.");

            // Get access to raw audio/video samples???

            Console.ReadLine();
        }
    }
}

解决方法

此API是UWP Media Player API的一部分。您不应该使用MediaSource来读取视频/音频样本,因为它被指定为具有统一Media Player播放项管理功能的各种Media Foundation媒体源的包装。

MediaSource唯一有用的是包装源并将其安排用于Media Player播放。 Media Player能够在后台访问潜在的Media Foundation资源。

MediaStreamSource属性特别是null,因为此媒体源实例不是基于MediaStreamSource的实现。如果您创建了提供MediaStreamSource的媒体源,则可以分别提供该属性,前提是您可以访问原始提供的实现层。您有一个不同类型的源,因此您的非null属性可能是IRandomAccessStream

要检索单个样本,您需要诸如Media Foundation Media Sources,Media Foundation Source Reader,相机Windows.Media.Capture.Frames之类的东西。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。