使用 libavformat 比使用 popen 调用 ffmpeg 更快吗?
Is it faster using libavformat over calling ffmpeg with popen?
我有一大块 C 语言的视频处理代码,它似乎受到我从 ffmpeg 管道读取字节的速率的瓶颈。
我需要对 ffmpeg 或潜在 libav* 提供的原始视频帧进行解码。
与使用 libav 库相比,fread 调用打开的子进程 ffmpeg 是否有很大的开销?
这里有几个方面。首先,为什么您的应用程序似乎受到 ffmpeg 管道输入的瓶颈?答案可能很简单:因为 ffmpeg 需要更多 CPU(因此是两个应用程序组合的瓶颈)。如果你 运行 b,而a占用的多CPU,那么从b的角度来看,管道的输入就慢了。这是合乎逻辑的,因为 a 需要更多时间。这个没有办法解决,ffmpeg是supposed多拿CPU,因为(取决于什么codec/resolution等),多媒体处理 是一项非常 CPU-intensive 的任务。
其次,使用 C API 而不是管道会有帮助吗?这取决于你在做什么。如果您将 ffmpeg 用于一项相当琐碎的任务,例如在不解压的情况下从磁盘读取文件(例如未压缩的 video/audio),那么是的,管道的开销相当大。如果 ffmpeg 解压缩 H264/HEVC 或 VP9 视频,您不太可能从这一举措中看到收益,或者它们至少会很小(1% 范围),因为大部分时间都花在解码视频上。 copy/transfer 的数据几乎可以忽略不计。所以在那种情况下,问题是:1% 值得吗?由您决定。
我有一大块 C 语言的视频处理代码,它似乎受到我从 ffmpeg 管道读取字节的速率的瓶颈。
我需要对 ffmpeg 或潜在 libav* 提供的原始视频帧进行解码。
与使用 libav 库相比,fread 调用打开的子进程 ffmpeg 是否有很大的开销?
这里有几个方面。首先,为什么您的应用程序似乎受到 ffmpeg 管道输入的瓶颈?答案可能很简单:因为 ffmpeg 需要更多 CPU(因此是两个应用程序组合的瓶颈)。如果你 运行 b,而a占用的多CPU,那么从b的角度来看,管道的输入就慢了。这是合乎逻辑的,因为 a 需要更多时间。这个没有办法解决,ffmpeg是supposed多拿CPU,因为(取决于什么codec/resolution等),多媒体处理 是一项非常 CPU-intensive 的任务。
其次,使用 C API 而不是管道会有帮助吗?这取决于你在做什么。如果您将 ffmpeg 用于一项相当琐碎的任务,例如在不解压的情况下从磁盘读取文件(例如未压缩的 video/audio),那么是的,管道的开销相当大。如果 ffmpeg 解压缩 H264/HEVC 或 VP9 视频,您不太可能从这一举措中看到收益,或者它们至少会很小(1% 范围),因为大部分时间都花在解码视频上。 copy/transfer 的数据几乎可以忽略不计。所以在那种情况下,问题是:1% 值得吗?由您决定。