2

我要解决的问题涉及使用自定义传输通过网络发送视频。也就是说,我需要压缩视频,但实际传输的不是标准协议,但是,我仍然需要对帧进行打包。我正在寻找一种将输入源的单个帧抓取传递到编码器,通过网络传输编码输出,然后在另一端将帧解码为某个图像(首选标准位图)的方法。我需要使用 h.264,但不需要特定语言。我的平台是Linux。

我查看了 ffmpeg 和 vlc,但我看到的唯一编码和解码功能是针对整个文件的。不幸的是,我在编码时没有可用的整个文件。我一次只有一张图片。

像这样的东西:

byte[] inputFrame = someImage;
byte[] encodedFrame = H264Encoder.EncodeNextFrame(inputFrame);
...Transmit frame
byte[] inputFrame = H264Decoder.DecodeNextFrame(encodedFrame);

有谁知道这样做的方法?任何帮助将不胜感激。

4

2 回答 2

1

我会推荐 libavformat/libavcodec。这些是 ffmpeg 背后的库。可以在这里找到一个很好的起点http://dranger.com/ffmpeg/。它有点过时了,您需要查看文档以找到更新的调用约定。例如 av_open_input_file() 现在是 avformat_open_input()。

于 2013-09-16T23:18:31.330 回答
1

我会为您的专有协议/格式编写自己的 ffmpeg 复用器/解复用器,或者至少将其 rtp 打包用于 h.264 比特流。

它并不像听起来那么可怕:

  • 使用一些一般信息(名称、支持的扩展)、指向函数 write_header、write_packet、write_trailer(和 read_header、read_packet、read_close)的指针填充 AVOutputFormat/AVInputFormat 结构,

  • 为这些结构调用 av_register_output_format/av_register_input_format,

  • 在您的编码/解码过程中使用它们。

我正在寻找的是一种传递单个帧抓取的方法

也许将 h.264 用于单个帧编码有点过头了。H.264 是为编码图片组而设计的,因为如果只编码一帧,所有这些特征,如 I/P/B 帧、多个参考帧、运动估计都没有意义。实际上,生成的流将仅包含 I 帧,因此我会考虑使用简单的 jpeg 编码来解决您的问题。

于 2013-09-17T20:15:08.453 回答