微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何启动FFmpeg进程,创建管道并从父进程写入数据?

如何解决如何启动FFmpeg进程,创建管道并从父进程写入数据?

我的代码基于 https://stackoverflow.com/a/32279430/5941827

我使用以下参数运行 FFmpeg:

std::stringstream sstm;
sstm << "ffmpeg -loglevel error -y -f rawvideo -vcodec rawvideo -s " << std::to_string(width) << "x" << std::to_string(height) //
        << " -pix_fmt rgb24 -framerate " << std::to_string(fps) << " -i - -c:v libx264 -preset " << getPreset(encodeSpeed) << //
        " -crf " << std::to_string(crf) << " -shortest " << path;

(变量在类构造函数中正确初始化)

然后我用 pPipe = popen(sstm.str().c_str(),"w") 打开管道。问题是在我 fwrite 到它并调用 fclose 之后,根据我写的内容,有时或多或少的字节到达 FFmpeg,并且我得到

[rawvideo @ 000000000010c3df] Invalid buffer size,packet size 196606 < expected frame_size 196608
Error while decoding stream #0:0: Invalid argument

保存的输出视频通常比预期多或少一帧。 我已经用 fwrite 检查了我通过管道发送的数组,它的大小是正确的。 看来根据我发送的数据,有些字节没有到达那里,或者通过管道发送的字节数比我发送的多。

我也尝试了两种不同的 FFmpeg 版本,但错误信息相同。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。