我的 C++ 应用程序接收 H.264 RTP 视频流。
现在它对流进行解码,将其保存到 YUV 文件中,然后我使用 ffmpeg 将文件重新编码为适合在 Windows PC 上观看的内容(例如 Mpeg4 AVI)。
不应该将 H.264 流保存到 AVI(或类似)容器中,而无需对其进行解码和重新编码吗?这将需要在 PC 上安装一些 H.264 解码器才能观看,但它的效率应该更高。
那怎么可能呢?有没有支持的图书馆?
您的程序可以通过管道传输 rtp 本身ffmpeg
——甚至使用popen3()
.
似乎您需要使用中间 SDP 文件- 我推测您可以将创建的文件指定为命名管道或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 流 vs AVI),而不需要对视频和音频进行转码(这是-vcodec copy
开关);因此,您不会损失质量,而且速度会非常快。
使用 ffmpeg 是正确的,但到目前为止发布的答案对我来说并不正确。
正确的开关应该是:
-vcodec copy