File FFMPEG:Windows中的标准输出与文件
我有一个应用程序(File FFMPEG:Windows中的标准输出与文件,file,ffmpeg,stdout,fwrite,dump,File,Ffmpeg,Stdout,Fwrite,Dump,我有一个应用程序(app1.exe),它使用ffmpeg库生成mpeg4帧,我想将这些帧转储到另一个从stdin读取的应用程序 连接它们最简单的方法是通过文件,这是可行的,但现在我想使用管道 所以在app1.exe中我有 fwrite(pkt.data, 1, pkt.size, (FILE*) f ); // for each frame 它创建了一个test.m4v文件,工作正常,但当我将其更改为 fwrite(pkt.data, 1, pkt.size, stdout ); // for
app1.exe
),它使用ffmpeg库生成mpeg4帧,我想将这些帧转储到另一个从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
文件生成正确,但内容已损坏:
使用以下文件生成:
使用标准输出生成:
我的第一个想法是检查应用程序是否生成了帧以外的任何标准输出,但它没有,使用文件版本进行检查,并通过app1.exe>text.txt
转储标准输出,但文件是空的。唯一的“out”是stderr,但它们只在应用程序退出时出现
使用notepad++打开这两个版本的test.m4v,显示了非常相似的数据,我甚至可以说这两个版本的数据都是一样的
所以我的问题是,写入文件和将标准输出转储到文件之间有什么区别?因为你提到了.exe,我猜这是在Windows上。确保与fwrite()对应的fopen()使用二进制模式,这样新行就不会被弄乱。例如,fopen()的第二个参数应该是“wb”,而不是“w”
因为你提到了.exe,我猜这是在Windows上。确保与fwrite()对应的fopen()使用二进制模式,这样新行就不会被弄乱。例如,fopen()的第二个参数应该是“wb”,而不是“w” (我认为)Windows默认情况下以ascii模式打开标准输出,并自动转换行尾。如果将stdout设置为binmode,则应该可以解决该问题 (我认为)Windows默认情况下以ascii模式打开标准输出,并自动转换行尾。如果将stdout设置为binmode,则应该可以解决该问题