【问题标题】:Setting individual pixels of an RGB frame for ffmpeg encoding为 ffmpeg 编码设置 RGB 帧的单个像素
【发布时间】:2013-05-15 14:39:23
【问题描述】:

我正在尝试将 ffmpeg 流媒体 Trouble syncing libavformat/ffmpeg with x264 and RTP 的测试模式更改为熟悉的 RGB 格式。我更广泛的目标是动态计算流式视频的帧。

所以我用AV_PIX_FMT_RGB24 替换了它的AV_PIX_FMT_MONOWHITE,根据http://libav.org/doxygen/master/pixfmt_8h.html,它是“压缩RGB 8:8:8, 24bpp, RGBRGB...”。

为了填充名为data 的像素数组,我尝试了很多变体

for (int y=0; y<HEIGHT; ++y) {
  for (int x=0; x<WIDTH; ++x) {
    uint8_t* rgb = data + ((y*WIDTH + x) *3);
    const double i = x/double(WIDTH);
//  const double j = y/double(HEIGHT);
    rgb[0] = 255*i;
    rgb[1] = 0;
    rgb[2] = 255*(1-i);
  }
}

HEIGHTxWIDTH= 80x60,这个版本产生 ,当我期望一个蓝色到红色的水平渐变时。

640x480 产生相同的 4 列模式,但水平条纹更多。

640x640、160x160 等,产生 三个 列,青色/洋红色/黄色,具有相同的水平条纹。

垂直渐变的表现更加怪异。

外观不受AV_PIX_FMT_RGBA 尝试的影响(4 而非 3 字节/像素,alpha=255)。也不受从 C 到 C++ 的移植的影响。

传递给sws_scale() 的参数srcStrides 是一个长度为1 的数组,包含单个int HEIGHT

Access each Pixel of AVFrame 提出了同样的问题,但没有详细回答。

流媒体发出一个警告,我怀疑这会影响外观:

[rtp @ 0x269c0a0] Encoder did not produce proper pts, making some up.

所以。如何设置帧中像素的 RGB 值发送到 sws_scale()(然后发送到 x264_encoder_encode() 和 av_interleaved_write_frame())?

【问题讨论】:

  • 我也在尝试动态计算帧并流式传输视频,但遇到了很多麻烦。你有没有做到这一点,你有你的代码吗?
  • 是的。这是我在 2013 年 5 月 14 日发布的答案。我没有包含完整的代码示例,因为几乎所有这些都只适用于动态计算框架的完整教程。这个 Q 和这些 A 中的链接应该足以让您编写对您自己的情况有用的代码。

标签: c++ ffmpeg libav libavformat


【解决方案1】:

使用avpicture_fill(),如Encoding a screenshot into a video using FFMPEG 中所述。

不要将 data 直接传递给 sws_scale(),而是这样做:

AVFrame* pic = avcodec_alloc_frame();
avpicture_fill((AVPicture *)pic, data, AV_PIX_FMT_RGB24, WIDTH, HEIGHT);

然后将sws_scale()的第二个和第三个参数替换为

pic->data, pic->linesize,

那么上面的渐变在很多分辨率下都能正常工作。

【讨论】:

  • 安东,感谢您的澄清。尽管如此,我还是建议“接受我自己的答案”(明天当 SO 允许时),因为它可以推广到 AV_PIX_FMT_RGB24 以外的格式并隐藏 linesize 的计算。
  • 数据是什么意思?它是如何定义的?
  • 这是avpicture_fill() 的第二个参数。研究我链接到的答案中的代码,以及该函数的文档。
【解决方案2】:

传递给 sws_scale() 的参数 srcStrides 是一个长度为 1 的数组,包含单个 int HEIGHT。

步幅 (AKA linesize) 是两行之间的字节距离。由于主要与优化有关的各种原因,它通常比简单的字节宽度大,因此每行的末尾都有填充。

在你的情况下,没有任何填充,步幅应该是宽度 * 3。

【讨论】:

    猜你喜欢
    • 2014-02-24
    • 1970-01-01
    • 2011-02-24
    • 2015-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-21
    • 2014-05-02
    相关资源
    最近更新 更多