使用 C# 和 .NET 2.0 从 mp4 中逐帧获取数据

Get frame by frame data from mp4 using C# and .NET 2.0

我目前正在使用 Unity 3D 进行开发,但我的背景是 Apple 开发。在 iOS/OSX 开发中,我可以使用 AVFoundation 加载 mp4 并在它以 BGRA 格式播放时逐帧获取数据。

我想知道这对于 .NET(Unity 使用 .NET 2.0)的等效项是什么?

我知道可以从 unity 调用 Objective-C++ 文件中的函数,但我需要一种在任何平台上执行此操作的方法,而不仅仅是 iOS.

据我所知,在 Unity 中 移动设备 上没有访问视频帧数据的内置方法。在移动设备上使用 Unity 播放视频简直令人难过。他们开箱即用的是 this,基本上只适用于全屏视频,例如剪辑场景。

如果你想做更复杂的事情,比如将视频传输到纹理,你有两个选择:

注意:资产商店中有更多可用资源,但这是我们使用的两个。

最佳选择?..

简单电影纹理

我们为我们的 VR 应用程序(Gear VR 和 Cardboard)使用 Easy Movie Texture。我们在 S6 上解码了多达 4k 的视频。

对于立体视频,我们使用插件附带的组件 VideoCopyTexture,它将纹理数据从视频复制到 material(以避免重复解码和渲染)。它引用 MediaPlayerCtrl.GetVideoTexture() returns 一个 Unity Texture2D,所以从那里你应该可以访问你需要的所有数据!

不是很好的选择,但我们有点用它所以我想我还是会提到它...

手机电影贴图

移动电影纹理仅适用于 ogg 编码视频。 我认为它不能让您访问原始帧数据,我建议您直接联系开发人员或查看文档。

但这可以是"hacked"。您可以使用渲染纹理,一个单独的相机,它看着 plane/quad 并在上面播放视频。然后获取该纹理的位图数据。这并不理想,但应该可以解决问题。

长话短说,我在 Unity 中使用类似的渲染到纹理机制将视频数据通过管道传输到 Scaleform,并且没有发现任何性能损失。 Mobile Movie Texture 并不是最快的开始,在我们的例子中甚至可以在某些设备上的软件中解码。但它无处不在。所以我们只用它来做小视频。

干杯,

J.