3

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

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

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

那怎么可能呢?有没有支持的图书馆?

4

2 回答 2

1

您的程序可以通过管道传输 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开关);因此,您不会损失质量,而且速度会非常快。

于 2010-10-18T07:48:01.400 回答
1

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

正确的开关应该是:

-vcodec copy
于 2010-10-18T07:52:18.393 回答