管道ppm文件到ffmpeg在c++中创建电影

Piping ppm files to ffmpeg to create movie in c++

本文关键字:c++ 创建 电影 ffmpeg ppm 文件 管道      更新时间:2023-10-16

我想在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 255n", 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

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

"P6n%d %dn255n"