繁体   English   中英

解码h264视频

[英]Decode h264 video

我正在寻找一种使用 c# 解码 h264(或实际上任何视频格式)的方法。 最终目标是能够实时解码图像并非常严格地控制播放。 我正在从事的项目是一个非线性视频艺术作品,其中要求高清素材动态循环和编辑,播放某些帧范围,然后无缝跳转到下一个随机选择的帧范围。

我创建了一个应用程序,它从磁盘读取图像文件 (jpegs) 并按顺序在屏幕上播放它们,我可以完全控制加载哪个帧以及何时显示它,但在全高清分辨率下它需要的时间比我想要的要长要从硬盘驱动器(每个大约 500k)加载图像,我认为使用压缩视频格式会更小,因此读取和解码到特定帧的速度更快,但是我找不到任何现成的方法来做到这一点。

有没有可以做到这一点的图书馆? 即从视频文件中提取任意帧并在比显示帧(以 25fps 运行)更短的时间内将其提供给我的应用程序,我已经查看了 ffmpeg 的 vlc 库和包装器,但我不知道哪个会更好,或者如果有另一个更好的选择。 此外,我不知道哪种编解码器是最佳选择,因为有些是基于关键帧的,这使得任意帧提取可能非常困难。

欢迎任何建议,谢谢

我会说使用 H.264 不是一个好主意。 这样做的原因是构成流的不同类型的帧

  • I 帧或关键帧:解码一帧所需的一切都是直接可用的,即不存在对其他帧的依赖性。

  • P 帧(预测帧):由与先前解码的帧的差异数据组成。

  • B 帧(双向):由之前解码的帧和未来的帧的差异数据组成。

该帧在比特流中编码的顺序是一样的是,帧应该被显示的顺序。

作为一个极端的例子,H.264 内容在剪辑的开头只能有 1 个 I 帧。 如果您需要显示最后一帧,则需要对每个中间帧进行解码,直到并包括最后一帧才能显示。

像您一样使用 JPEG 并不是一个坏主意。 您可以调整压缩级别以找到与质量和解码时间相关的最终文件大小。

视频解码器的输出几乎在所有情况下都是 4:2:0 子采样YUV未压缩原始数据。 一个 1080p 帧将是1920*1080*1.5=3110400 bytes 使用这种格式而不是JPEG(也解码为YUV 4:2:0)会从你的“应用程序”剃除解码时,留下查看时。 Imagemagick和一堆其他工具可以从 JPEG 转换为 YUV4:2:0。 这不能与注释中描述的内存映射结合使用。

如果您觉得原始格式占用大量磁盘空间,请查看huffyuv ,它是一种无损 YUV 编解码器。

对于查看器,我过去在使用SDL 时有丰富的经验,它理解 YUV 格式,这使得编写查看器变得非常简单。 幸运的是,已经编写了一个可以用作进一步开发的模板。 看看

我只想指出文件大小并不总是等于速度。 有时文件越小,解压成本就越高。 通过使用 BMP 或 WMF 等未压缩格式,您可能(并且我强调可能)实际上会获得更好的性能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM