【发布时间】: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