【问题标题】:Piping ppm files to ffmpeg to create movie in c++将 ppm 文件传送到 ffmpeg 以在 C++ 中创建电影
【发布时间】:2015-11-08 13:59:49
【问题描述】:

我想在 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

【问题讨论】:

  • 根据this,你应该试试ffmpeg -i pipe:0 ...
  • 仍然给出同样的错误。
  • ppm 文件不应该是 ascii 格式吗?你的 fwrite 要写二进制文件?
  • 有什么不同吗?我在linux上,所以我认为没关系。

标签: c++ c linux ffmpeg


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-12
    • 1970-01-01
    • 1970-01-01
    • 2017-06-26
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多