我的C ++应用程序接收H.264 RTP视频流。
现在它解码流,将其保存到YUV文件中,然后我使用ffmpeg将文件重新编码为适合在Windows PC上观看的内容(例如Mpeg4 AVI)。
不应该将H.264流保存到AVI(或类似)容器中而不必对其进行解码和重新编码?这需要在PC上观看一些H.264解码器,但它应该更有效率。
怎么可能这样呢?有没有图书馆支持这个?
答案 0 :(得分:1)
您的程序可以通过ffmpeg
管道rtp本身 - 甚至可以使用popen3()
调用它。
您似乎需要使用intermediate SDP file - 我推测您可以指定您创建的文件为named pipe或tmpfile()
应用程序写入的文件 - 使用该文件作为中间人。
命令行将是 之类的内容:
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