保存H.264 RTP流而无需重新编码?

时间:2010-10-17 21:45:55

标签: c++ ffmpeg h.264 rtp

我的C ++应用程序接收H.264 RTP视频流。

现在它解码流,将其保存到YUV文件中,然后我使用ffmpeg将文件重新编码为适合在Windows PC上观看的内容(例如Mpeg4 AVI)。

不应该将H.264流保存到AVI(或类似)容器中而不必对其进行解码和重新编码?这需要在PC上观看一些H.264解码器,但它应该更有效率。

怎么可能这样呢?有没有图书馆支持这个?

3 个答案:

答案 0 :(得分:1)

您的程序可以通过ffmpeg管道rtp本身 - 甚至可以使用popen3()调用它。

您似乎需要使用intermediate SDP file - 我推测您可以指定您创建的文件为named pipetmpfile()应用程序写入的文件 - 使用该文件作为中间人。

命令行将是 之类的内容:

int p[3];
const char* const out_fmt = "avi";
const char* cmd[] = {"ffmpeg","-f",,"-i",temp_sdp_filename,"-vcodec","copy","-f",out_fmt,"-",NULL};
if(-1 == popen3(p,cmd)) ...
// write the rtp that you receive to p[STDIN_FILENO]
// read the avi from p[STDOUT_FILENO]
// read any messages and error text from p[STDERR_FILENO] 

我相信在这种情况下,ffmpeg足够聪明,可以重新打包容器(rtp stream vs AVI)而无需转码视频和音频(这是-vcodec copy开关);因此,你没有质量损失,而且速度非常快。

答案 1 :(得分:1)

使用ffmpeg是正确的,但到目前为止发布的答案看起来不对我。

正确的开关应该是:

-vcodec copy

答案 2 :(得分:1)

您可以查看x264源代码。我一直在寻找一个容器,可以容纳已压缩的H264数据包(来自IP摄像头,所以写入文件然后转换方法也不适合我)。在那里你可以找到raw,MP4,Matroska和FLV容器实现。这是链接:http://www.videolan.org/developers/x264.html