c - 如何通过管道传输到 ffmpeg RGB 值 10?

标签 c ffmpeg pipe

我正在尝试使用 ffmpeg 创建视频文件。我拥有每一帧的所有 RGB 像素数据,并遵循 this blogpost 我有通过管道逐帧发送数据的代码。它主要工作。但是,如果任何像素在 3 个 channel 中的任何一个中的值为 10(例如 #00000A、#0AFFFF 等),则会产生以下错误:

[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 是换行符,所以这会以某种方式混淆管道。
这里到底发生了什么,我该如何修复它,以便我可以使用像 #00000a 这样的 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 版本。

关于c - 如何通过管道传输到 ffmpeg RGB 值 10?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68247249/

相关文章:

c - Fork and Pipe 问题 - 无限打印

c - 获取字符串 token 的长度

C "warning: initialization from incompatible pointer type"当函数有一个数组作为参数时

c++ - FFMPEG。读取帧,处理它,把它输出视频。复制声音流不变

python - 我下载音频文件,但采用 m3u8 格式。如何转换成mp3?

linux - 在linux中,echo和pipe如何与docker一起工作?

c - PeekNamedPipe 总是为 totalBytesAvailable 返回 0

c - 使用 getchar() 和 putchar() 的非常简单的 C 问题

c# - 转换为 YUV/YCbCr 颜色空间 - 许多版本

winapi - 匿名管道上的重叠 I/O