我有一个使用 ffmpeg 库生成 mpeg4 帧的应用程序 (app1.exe
),我想将这些帧转储到另一个从 stdin 读取的应用程序。
连接它们的最简单方法是通过文件,这可行,但现在我想使用管道。
所以在app1.exe
中我有
fwrite(pkt.data, 1, pkt.size, (FILE*) f ); // for each frame
它创建了一个 test.m4v 文件,工作正常,但是当我将其更改为
fwrite(pkt.data, 1, pkt.size, stdout ); // for each frame
然后将其转储到文件 app1.exe > test.m4v
文件生成正确,但内容已损坏:
使用文件生成:
使用 STDOUT 生成:
我的第一个想法是检查应用程序是否生成了除框架之外的任何标准输出,但它没有,使用 FILE 版本进行检查并通过 app1.exe>text.txt
转储标准输出,但文件是空的。唯一的“输出”是 stderrs,但它们仅在应用程序退出时发生。
使用 notepad++ 打开两个版本的 test.m4v 结果显示非常相似的数据,我什至会说两者都是相同的。
所以我的问题是,写入 FILE 和将 stdout 转储到文件有什么区别?
最佳答案
因为你提到了 .exe,我猜这是在 Windows 上。确保与 fwrite() 对应的 fopen() 使用二进制模式,这样换行符就不会被破坏。例如,fopen() 的第二个参数应该是“wb”,而不是“w”。
关于file - FFMPEG:Windows 中的标准输出与文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22639407/