我想解决的问题是使用自定义传输通过网络发送视频。也就是说,我需要压缩视频但实际传输不是标准协议,但是,我仍然需要对帧进行打包。我正在寻找的是一种方法,将输入源的单个帧抓取传递到编码器,通过网络传输编码输出,然后在另一端将帧解码为某些图像(首选标准位图)。我需要使用h.264,但不需要特定的语言。我的平台是Linux。
我查看了ffmpeg和vlc,但我看到的唯一编码和解码功能是针对整个文件。遗憾的是,我在编码时没有提供整个文件。我只是一次只有一张图片。
这样的事情:
byte[] inputFrame = someImage;
byte[] encodedFrame = H264Encoder.EncodeNextFrame(inputFrame);
...Transmit frame
byte[] inputFrame = H264Decoder.DecodeNextFrame(encodedFrame);
有谁知道这样做的方法?任何帮助将不胜感激。
答案 0 :(得分:1)
我会推荐libavformat / libavcodec。这些是ffmpeg背后的库。这里有一个很好的起点http://dranger.com/ffmpeg/。它有点过时了,您需要查看文档以查找更新的调用约定。例如,av_open_input_file()现在是avformat_open_input()。
答案 1 :(得分:1)
我会为你的专有协议/格式编写我自己的ffmpeg muxer / demuxer,或者至少使用它的rtp打包来获得h.264比特流。
听起来并不那么可怕:
使用一些常规信息(名称,支持的扩展名)填充AVOutputFormat / AVInputFormat结构,指向函数write_header,write_packet,write_trailer(和read_header,read_packet,read_close)的指针,
为这些结构调用av_register_output_format / av_register_input_format,
在编码/解码过程中使用它们。
我正在寻找的是一种传递单个帧抓取的方法
使用h.264进行单个帧编码可能有点过分。 H.264设计用于编码图像组,因为如果仅编码一帧,所有这些功能如I / P / B帧,多个参考帧,运动估计都没有意义。实际上结果流只包含I帧,所以我会考虑简单的jpeg编码来解决你的问题。