我有一个使用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
文件生成正确,但内容已损坏:
使用FILE生成:
使用STDOUT生成:
我的第一个想法是检查应用程序是否生成除帧之外的任何标准输出,但它没有使用FILE版本检查并通过app1.exe>text.txt
转储标准输出,但文件为空。唯一的"出局"是stderrs,但它们只在应用程序退出时出现。
打开带有notepad ++的两个版本的结果test.m4v显示非常相似的数据,我甚至会说两者都相同。
所以我的问题是,写入FILE和将stdout转储到文件有什么区别?
答案 0 :(得分:2)
因为你提到.exe,我猜这是在Windows上。确保对应于fwrite()的fopen()使用二进制模式,因此换行不会被破坏。例如,fopen()的第二个参数应该是“wb”,而不是“w”。
答案 1 :(得分:2)
(我认为)Windows默认以ascii模式打开stdout,并自动转换行结尾。如果将stdout设置为binmode,则应该解决问题。