我正在寻找一种使用c#解码h264 (或任何视频格式)的方法。最终目标是能够解码图像,并非常严格地控制实时回放。我正在工作的项目是一个非线性的视频艺术作品,其中高清镜头需要循环和编辑自己的飞行,播放某些帧范围,然后无缝地跳到下一个随机选择的帧范围。
我已经创建了一个从磁盘读取图像文件(Jpeg)的应用程序,并按顺序在屏幕上播放它们,我完全控制加载哪个帧以及何时显示,但在全高清分辨率下,它需要的时间略长于我想从硬盘驱动器加载图像(约500k ),我认为使用压缩视频格式将更小,因此更快地读取和解码到特定的帧,但我找不到任何现成的方法来做到这一点。
有没有可以做到这一点的库?例如,从视频文件中提取任意帧并将其提供给我的应用程序所需的时间少于显示该帧所需的时间(运行速度为25fps),我已经研究了ffmpeg的vlc库和包装器,但我不知道哪一个会更好,或者是否有其他更好的选择。此外,我不知道哪个编解码器会是最好的选择,因为有些编解码器是基于关键帧的,这使得提取任意帧可能非常困难。
欢迎任何建议,谢谢
发布于 2011-08-30 04:50:28
我要说的是,使用H.264不是一个好主意。这样做的原因是构成流的不同类型的帧
预测I帧或关键帧:解码一个帧所需的一切都是直接可用的,即不存在对其他预测帧的依赖性(-
帧在bistream中的编码顺序与帧应该显示的顺序不同。
作为一个极端的例子,H.264内容在剪辑的开头只能有1个I帧。如果需要显示最后一帧,则需要对每个中间帧进行解码,直到包括最后一帧才能显示。
像你开始做的那样使用JPEG不是一个坏主意。您可以尝试压缩级别,以找到与质量和解码时间相关的最终文件大小。
视频解码器的输出几乎在所有情况下都是4:2:0次采样的YUV未压缩原始数据。一个1080p帧将是1920*1080*1.5=3110400 bytes。使用这种格式而不是JPEG (JPEG也可以解码为YUV4:2:0)将减少“应用程序”的解码时间,只留下视图时间。Imagemagick和许多其他工具可以将JPEG格式转换为YUV4:2:0格式。这不能与注释中描述的内存映射相结合。
如果您觉得raw格式占用大量磁盘空间,可以看看huffyuv,它是一种无损的YUV-codec。
作为一名查看器,我在过去使用SDL有很好的经验,它理解YUV格式,使得编写查看器变得非常简单。幸运的是,已经编写了一个,可以用作进一步开发的模板。看一看yay
发布于 2011-08-30 05:57:12
我只想指出文件大小并不总是等同于速度。文件越小,解压缩成本有时就越高。您可能(我强调的是可能是)实际上可以通过使用BMP或WMF等未压缩格式获得更好的性能。
https://stackoverflow.com/questions/7221287
复制相似问题