c-如何管道到ffmpeg RGB值10



我正在尝试使用ffmpeg创建一个视频文件。我有每帧的所有RGB像素数据,在这篇博客文章之后,我有代码通过管道逐帧发送数据。而且它主要起作用。然而,如果在3个通道中的任何一个通道中,任何像素的值为10(例如#00000A、#0AFFFFF等(,则会产生以下错误:

[rawvideo @ 0000020c3787f040] Packet corrupt (stream = 0, dts = 170) 
pipe:: corrupt input packet in stream 0
[rawvideo @ 0000020c3789f100] Invalid buffer size, packet size 32768 < expected frame_size 49152
Error while decoding stream #0:0: Invalid argument

并且输出的视频是乱码的。现在我怀疑,因为ASCII中的10是换行符,这在某种程度上混淆了管道。这里到底发生了什么?我该如何修复它,以便使用#000000a这样的RGB值?

下面是C代码,它是这个的一个例子

#include <stdio.h>
unsigned char frame[128][128][3];
int main() {

int x, y, i;
FILE *pipeout = popen("ffmpeg -y -f rawvideo -vcodec rawvideo -pix_fmt rgb24 -s 128x128 -r 24 -i - -f mp4 -q:v 1 -an -vcodec mpeg4 output.mp4", "w");

for (i = 0; i < 128; i++) {
for (x = 0; x < 128; ++x) {
for (y = 0; y < 128; ++y) {
frame[y][x][0] = 0;
frame[y][x][1] = 0;
frame[y][x][2] = 10;
} 
}
fwrite(frame, 1, 128*128*3, pipeout);
} 

fflush(pipeout);
pclose(pipeout);
return 0;
}

编辑:为了清楚起见,我使用的是Windows

我刚刚在Linux中尝试了你的代码,它对我很有效。我认为@Craig Estey的建议可能就是答案。

如果不起作用,可以尝试使用write而不是fwrite写入数据(如果可用(。(我过去曾遇到过使用fread/fwrite函数族将二进制数据写入管道的问题。(

所以你可以尝试更改这条线:

fwrite(frame, 1, 128*128*3, pipeout);

类似于:

int fd = fileno(pipeout);
write(fd, frame, sizeof(frame));

并删除以下行:

fflush(pipeout);

编辑:在你链接的博客文章的评论部分有一些疑难解答技巧。特别是关于此程序的Windows版本。

相关内容

  • 没有找到相关文章

最新更新