从 Windows.Media.Core.MediaSource 访问原始 audio/video 帧
Access raw audio/video frames from Windows.Media.Core.MediaSource
我想在没有 MediaPlayer
的控制台应用程序中使用 Windows.Media.Core.MediaSource
。相反,我只想将源设置为 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 媒体播放器 API 的一部分。您不应该使用 MediaSource
阅读 video/audio 样本,因为它被指定为不同类型的 Media Foundation 媒体源的包装器,具有统一的 Media Player 播放项目管理。
MediaSource
唯一有用的是包装源并安排它们用于媒体播放器播放。 Media Player 能够在后台访问底层 Media Foundation 源。
MediaStreamSource
属性 特别是 null
因为此媒体源实例不基于 MediaStreamSource
实现。如果您创建了提供 MediaStreamSource
的媒体源,您将分别拥有 属性,前提是您可以访问最初提供的实施层。您有不同类型的来源,因此您的 non-null 属性 很可能是 IRandomAccessStream
.
要检索单个样本,您需要诸如 Media Foundation Media Sources、Media Foundation Source Reader、Windows.Media.Capture.Frames
相机等
我想在没有 MediaPlayer
的控制台应用程序中使用 Windows.Media.Core.MediaSource
。相反,我只想将源设置为 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 媒体播放器 API 的一部分。您不应该使用 MediaSource
阅读 video/audio 样本,因为它被指定为不同类型的 Media Foundation 媒体源的包装器,具有统一的 Media Player 播放项目管理。
MediaSource
唯一有用的是包装源并安排它们用于媒体播放器播放。 Media Player 能够在后台访问底层 Media Foundation 源。
MediaStreamSource
属性 特别是 null
因为此媒体源实例不基于 MediaStreamSource
实现。如果您创建了提供 MediaStreamSource
的媒体源,您将分别拥有 属性,前提是您可以访问最初提供的实施层。您有不同类型的来源,因此您的 non-null 属性 很可能是 IRandomAccessStream
.
要检索单个样本,您需要诸如 Media Foundation Media Sources、Media Foundation Source Reader、Windows.Media.Capture.Frames
相机等