【问题标题】:Saving H.264 RTP stream without re-encoding?在不重新编码的情况下保存 H.264 RTP 流?
【发布时间】:2011-04-26 16:59:27
【问题描述】:

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

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

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

那怎么可能呢?有没有支持的库?

【问题讨论】:

  • 我认为mencoder 可以将H.264 放入AVI 容器中而无需解码,-ovc copymencoder 是开源的,大家可以去看看。
  • @liori 是的,整个 10 MB 源代码都是开源的... ;-)

标签: c++ ffmpeg h.264 rtp


【解决方案1】:

您的程序可以通过ffmpeg 传递rtp 本身——甚至可以使用popen3() 调用它。

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

命令行会是 something 比如:

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只允许rtp格式输出,不允许输入。另外,我相信从标准输入读取,ffmpeg 需要“-i -”,而不仅仅是“-”。
  • @Gene Vincent 是的,谷歌搜索几乎没有提示
【解决方案2】:

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

正确的开关应该是:

-vcodec copy

【讨论】:

    猜你喜欢
    • 2017-10-19
    • 1970-01-01
    • 1970-01-01
    • 2011-10-05
    • 1970-01-01
    • 2011-12-03
    • 1970-01-01
    • 2014-03-18
    • 1970-01-01
    相关资源
    最近更新 更多