解码h264视频

时间:2011-08-28 13:32:37

标签: c# video ffmpeg decode codec

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

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

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

欢迎任何建议,谢谢

3 个答案:

答案 0 :(得分:2)

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

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

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

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

在bistream中编码帧的顺序 not 与帧应显示的顺序相同。

作为一个极端的例子,H.264内容在剪辑开始时只能有1个I帧。如果需要显示最后一帧,则需要将每个中间帧解码到最后一帧并包括最后一帧,以便显示它。

在你盯着看时使用JPEG并不是一个坏主意。您可以使用压缩级别来查找关于质量和解码时间的最终文件大小。

视频解码器的输出几乎在所有情况下都是4:2:0次采样YUV未压缩的原始数据。一个1080p帧将为1920*1080*1.5=3110400 bytes。使用此格式而不是JPEG(也可解码为YUV4:2:0)将减少“应用程序”的解码时间,使只是视图时间。 Imagemagick和许多其他工具可以从JPEG转换为YUV4:2:0。这不能与评论中描述的内存映射相结合。

如果您认为原始格式占用了大量磁盘空间,请查看huffyuv这是一个无损YUV编解码器。

对于观众而言,我过去使用SDL获得了很好的经验,yay了解YUV格式,因此编写查看器非常简单。幸运的是,已经有一篇文章可以作为模板用于进一步开发。看看{{3}}

答案 1 :(得分:0)

http://sourceforge.net/projects/mfnet/

Windows Media Foundation也许。

答案 2 :(得分:0)

我只是想指出文件大小并不总是等于速度。文件越小,解压缩成本越高。您可以(并且我强调 可能 )通过使用未压缩格式(例如BMP或WMF)来实现更好的性能。