首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Media Foundation源阅读器读取3D (左-右)视频

使用Media Foundation源阅读器读取3D (左-右)视频
EN

Stack Overflow用户
提问于 2018-12-25 00:32:08
回答 1查看 477关注 0票数 1

当尝试读取标记为3D left-right的4K视频时,IMFSourceReader返回大小为1920x2160的图像(图像的一半)。如果可能的话,我想获得完整的图像,或者至少可以访问后半部分。

我知道MF_ENABLE_3DVIDEO_OUTPUT,但我不确定如何将其应用于IMFSourceReader。我尝试将其设置为媒体类型,但这并没有改变任何事情。

源码阅读器告诉我流的宽度是帧大小的一半( 4K电影的大小是1920x2160),但是当我在样本上使用GetBufferCount时,结果是1。所以我不知道如何获取帧的所有数据。

我看了一下DX11VideoRenderer示例,它似乎假设GetBufferCount返回2,但是它没有使用IMFSourceReader,所以我不确定如何将它所做的应用到该场景中。

最好,我想要的是使用MF3DVideoOutputType_BaseView并获得完整的4K源图。

编辑:

这与Facebook 180的数据有关。(设置“半等长矩形”和“并排”。它在MP4中生成YouTube V1球形元数据,并具有Facebook为180度立体视频识别的特定设置。)

这里有一个示例视频:https://drive.google.com/open?id=154dl33y9RKZcvTqdBZkLQ5Y5ckG2mZtf (它将在未来的某个时候被删除;如果有人对上传到哪里有更好的建议,请随时建议)。

EN

回答 1

Stack Overflow用户

发布于 2018-12-26 17:44:31

这可能不是一个确切的答案,因为我可以通过简单的阅读来做你想做的事情。但是,下面的步骤可能会提示您应该在何处进行故障排除。

IMFSourceReader返回大小为1920x2160的图像(图像的一半)。如果可能的话,我想获得完整的图像,或者至少可以访问后半部分。

我用一个应用程序处理了你的样本视频,该应用程序使用MF Source Reader读取视频,解压缩并保存为单独的帧。我看到视频的两部分都是可以访问的。

以下是详细信息。

视频媒体类型表示3D视频:

代码语言:javascript
运行
复制
MF_MT_MAJOR_TYPE, vValue {73646976-0000-0010-8000-00AA00389B71} (Type VT_CLSID, MFMediaType_Video, FourCC vids)
MF_MT_SUBTYPE, vValue {34363248-0000-0010-8000-00AA00389B71} (Type VT_CLSID, MFVideoFormat_H264, FourCC H264)
MF_MT_AM_FORMAT_TYPE, vValue {E06D80E3-DB46-11CF-B4D1-00805F6CBBEA} (Type VT_CLSID, WMFORMAT_MPEG2Video)
MF_MT_VIDEO_PROFILE, vValue 100 (Type VT_UI4)
MF_MT_VIDEO_LEVEL, vValue 51 (Type VT_UI4)
MF_MT_FRAME_SIZE, vValue 16492674418800 (Type VT_UI8, 3840x2160)
MF_MT_PIXEL_ASPECT_RATIO, vValue 4294967297 (Type VT_UI8, 1:1)
MF_MT_INTERLACE_MODE, vValue 7 (Type VT_UI4)
MF_MT_FRAME_RATE, vValue 128849018881001 (Type VT_UI8, 30000/1001, 29.970)
MF_MT_SAMPLE_SIZE, vValue 1 (Type VT_UI4)
MF_MT_AVG_BITRATE, vValue 82101870 (Type VT_UI4)
MF_MT_MPEG4_CURRENT_SAMPLE_ENTRY, vValue 0 (Type VT_UI4)
MF_MT_MPEG4_SAMPLE_DESCRIPTION, vValue 00 00 59 2A 73 74 73 64 00 00 00 00 00 00 00 01 00 00 59 1A 61 76 63 31 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0F 00 08 70 00 48 00 00 00 48 00 00 00 00 00 00 00 01 15 41 6D 62 61 72 65 6C 6C 61 20 41 56 43 20 65 6E 63 6F 64 65 72 00 00 00 00 00 00 00 00 00 00 00 18 FF FF 00 00 00 4B 61 76 63 43 01 64 00 33 FF E1 00 34 27 64 00 33 AC 34 C8 03 C0 04... (Type VT_VECTOR | VT_UI1)
MF_MT_MPEG_SEQUENCE_HEADER, vValue 00 00 01 27 64 00 33 AC 34 C8 03 C0 04 3E 84 00 00 0F A4 00 03 A9 83 A1 80 00 4C 4B 40 00 03 93 87 0B BC B8 D0 C0 00 26 25 A0 00 01 C9 C3 85 DE 5C 3E 11 08 D4 00 00 00 00 01 28 EE 38 B0 (Type VT_VECTOR | VT_UI1)
MF_MT_VIDEO_3D, vValue 1 (Type VT_UI4)
MF_MT_VIDEO_3D_FORMAT, vValue 2 (Type VT_UI4)
MF_MT_VIDEO_ROTATION, vValue 0 (Type VT_UI4)
MF_NALU_LENGTH_SET, vValue 1 (Type VT_UI4)
MF_PROGRESSIVE_CODING_CONTENT, vValue 1 (Type VT_UI4)
{11D25A49-BB62-467F-9DB1-C17165716C49}, vValue 00 00 00 00 00 00 00 00 00 00 00 00 (Type VT_VECTOR | VT_UI1)
{4A8FC407-6EA1-46C8-B567-6971D4A139C3}, vValue 0 (Type VT_UI4)
{A51DA449-3FDC-478C-BCB5-30BE76595F55}, vValue 1 (Type VT_UI4)

注:MFVideo3DSampleFormat_Packed_LeftRight的3840x2160分辨率和MF_MT_VIDEO_3D_FORMAT

每个媒体样本都包含一个缓冲区,两个视图并排打包到一个帧中。

这似乎是对您的文件的正确读取。我让我的应用程序使用以下媒体类型设置具有SetCurrentMediaType调用的源阅读器:

代码语言:javascript
运行
复制
MF_MT_MAJOR_TYPE, vValue {73646976-0000-0010-8000-00AA00389B71} (Type VT_CLSID, MFMediaType_Video, FourCC vids)
MF_MT_SUBTYPE, vValue {00000016-0000-0010-8000-00AA00389B71} (Type VT_CLSID, MFVideoFormat_RGB32, FourCC 0x00000016)
MF_MT_FRAME_SIZE, vValue 16492674418800 (Type VT_UI8, 3840x2160)
MF_MT_PIXEL_ASPECT_RATIO, vValue 4294967297 (Type VT_UI8, 1:1)
MF_MT_INTERLACE_MODE, vValue 2 (Type VT_UI4)
MF_MT_FRAME_RATE, vValue 128849018881001 (Type VT_UI8, 30000/1001, 29.970)

也就是说,它请求将视频解压为全分辨率RGB格式。

Source Reader可以接受这样的请求,并提供一个视频解码器来满足格式转换:

代码语言:javascript
运行
复制
Category MFT_CATEGORY_VIDEO_DECODER, Direct3D 11 Aware, Input MFVideoFormat_H264, 3840 x 2160, Output MFVideoFormat_NV12, 3840 x 2160

显然,解码器是H.264 Video Decoder,以防你想要在内部源码阅读器管道之外直接管理它。

第一个读取的视频示例具有以下属性:

代码语言:javascript
运行
复制
MF_NALU_LENGTH_INFORMATION, vValue  (Type VT_VECTOR | VT_UI1)
MFSampleExtension_ForwardedDecodeUnits, vValue ??? (Type VT_UNKNOWN)
MFSampleExtension_AccumulatedNonRefPicPercent, vValue 0 (Type VT_UI4)
MFSampleExtension_Token, vValue ??? (Type VT_UNKNOWN, 0x00000282397B1020)
MFSampleExtension_CleanPoint, vValue 1 (Type VT_UI4)
MFSampleExtension_Discontinuity, vValue 1 (Type VT_UI4)
MFSampleExtension_FrameCorruption, vValue 0 (Type VT_UI4)
nSampleTime 0, nSampleDuration 33 3666, nBufferCount 1, nTotalLength 33177600
nBufferIndex 0, nCurrentLength 33177600, nMaxLength 33177600

如您所见,它有一个缓冲区,数据大小为3840 * 2160 *4字节。图像本身就是我上面附加的那张,两半都有。

这是Windows 10 2018年10月更新(版本1809)上的行为。我认为该行为基本上符合您的原始请求。我还看到MP4原子也表示全分辨率(3840x2160),所以总的来说,我在上面提到的行为和我实际看到的行为都是很正常的。更重要的是,即使SDK topoedit播放文件的两个一半,这意味着要实现电影和电视的行为时,立体声是混合从一半,这是有必要以特定的方式配置解码器。

据我所知,你看到了一个不同的行为,这应该是有原因的,最有可能与视频解码器有关,或者是后解码步骤,要么剥离一半的视频,要么在你没有请求的地方应用联合视图的合成。由于视频是以left+right方式编码的,我想说管道中的某些东西不太可能硬编码来丢弃后半部分,并且无法控制这一点,也许这可能是管道配置的问题。

然而,也可能发生的情况是,Windows的早期版本缺乏对球形视频的支持,并截断了视频,因为它由一半组成,但同时还没有针对球形功能的代码路径和实现。

Windows 10, version 1803 provides support for 360 camera preview, capture, and record with existing MediaCapture APIs. […]

2018年12月27日更新:问题似乎仅限于或至少与启用MF_SOURCE_READER_ENABLE_ADVANCED_VIDEO_PROCESSING有关。启用时,源代码读取器应用Video Processor MFT以满足格式转换需要,而不是内部转换器(但不是硬件加速)。内部非硬件转换器透明地输出两个视图,甚至不知道一个框架中有两个视图。然而,视频处理器MFT宣布了立体声3D功能,并在其默认操作模式下放弃了下半场。

让它快速看一看,我无法启用它的3D输出选项,并将其切换为保留最右半部分,无论是作为单个缓冲区的一部分,还是作为辅助缓冲区,或者作为辅助纹理表面。然而,由于它看起来像是后解码器步骤中的后半部分被剥离,它应该工作得很好,例如-可能有许多类似的方法来做这个技巧- NV12纹理从源读取器读取,然后3D信息从样本/纹理中删除,进一步的像素格式转换,包括图形处理器使能,导致完整的3840x2160帧的转换而不删除后半部分。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53915769

复制
相关文章

相似问题

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