我刚刚开始在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作为第二个arg添加到MediaStreamSource中,但是因为我有一个混合流,所以我想它是不需要的),那么什么都不会发生。触发SampleRequested事件。没有抛出错误。它真的很难调试,这是一个非常痛苦的屁股。:S
发布于 2018-03-21 23:03:05
我有从文件位图构建工作视频MediaStreamSource的解决方案,但不幸的是没有找到RGBA缓冲区的解决方案。首先,阅读MediaStreamSource类文档-- https://learn.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和硬编码路径到jpeg文件,并将其永久用作MediaStreamSample。我们需要研究要设置哪个CodecSubtypes来使用RGBA (每像素4字节)格式的位图,比如瘦。
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);https://stackoverflow.com/questions/48173407
复制相似问题