将ppm文件管道化为ffmpeg以在c ++中创建电影

时间:2015-08-15 12:46:42

标签: c++ c linux ffmpeg

我想在Mandelbrot套装上创建一个缩放的电影。为此,我想以ppm格式创建图像数据,然后使用popen将其传输到ffmpeg。如果我先将ppm保存到光盘然后通过终端运行ffmpeg,则以下命令有效。

ffmpeg -i out.ppm -r 1/5 out.mp4

以下是我在代码中尝试做的事情。

FILE* p = popen("ffmpeg -i /dev/stdin -r 1/5 out.mp4", "w");
ppm_pipe(p, pix_buffers[0], w, h);
fclose(p);
...
void ppm_pipe(FILE* f, unsigned char* pix, int w, int h)
{
    assert(fprintf(f, "P6 %d %d 255\n", w, h) > 0);
    size_t sz = 3 * (size_t)w * (size_t)h;
    assert(fwrite(pix, 1, sz, f) == sz);
}

我收到以下错误消息。

ffmpeg version 2.5.8-0ubuntu0.15.04.1 Copyright (c) 2000-2015 the FFmpeg developers
  built with gcc 4.9.2 (Ubuntu 4.9.2-10ubuntu13)
  configuration: --prefix=/usr --extra-version=0ubuntu0.15.04.1 --build-suffix=-ffmpeg --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --shlibdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --enable-gpl --enable-shared --disable-stripping --enable-avresample --enable-avisynth --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmodplug --enable-libmp3lame --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-libschroedinger --enable-libshine --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libwavpack --enable-libwebp --enable-libxvid --enable-opengl --enable-x11grab --enable-libdc1394 --enable-libiec61883 --enable-libzvbi --enable-libzmq --enable-frei0r --enable-libvpx --enable-libx264 --enable-libsoxr --enable-gnutls --enable-openal --enable-libopencv --enable-librtmp --enable-libx265
  libavutil      54. 15.100 / 54. 15.100
  libavcodec     56. 13.100 / 56. 13.100
  libavformat    56. 15.102 / 56. 15.102
  libavdevice    56.  3.100 / 56.  3.100
  libavfilter     5.  2.103 /  5.  2.103
  libavresample   2.  1.  0 /  2.  1.  0
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  1.100 /  1.  1.100
  libpostproc    53.  3.100 / 53.  3.100
/dev/stdin: Invalid data found when processing input

1 个答案:

答案 0 :(得分:0)

PPM标题部分之间需要换行符'\ n',即P6和宽度/长度,以及宽度/长度和最大值。所以格式字符串应该是:

"P6\n%d %d\n255\n"