我正在尝试将 ffmpeg 流媒体的测试模式Trouble syncing libavformat/ffmpeg with x264 and RTP更改为熟悉的 RGB 格式。我更广泛的目标是动态计算流式视频的帧。
因此,我将其替换AV_PIX_FMT_MONOWHITE
为根据http://libav.org/doxygen/master/pixfmt_8h.htmlAV_PIX_FMT_RGB24
的“压缩 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);
}
}
在HEIGHT
x WIDTH
= 80x60 时,这个版本产生
,当我期望一个蓝色到红色的水平渐变时。
640x480 产生相同的 4 列模式,但水平条纹更多。
640x640、160x160 等,产生三列,青色/洋红色/黄色,具有相同的水平条纹。
垂直渐变的表现更加怪异。
外观不受AV_PIX_FMT_RGBA
尝试的影响(每个像素 4 个而不是 3 个字节,alpha=255)。也不受从 C 到 C++ 的移植的影响。
srcStrides
传递给的参数sws_scale()
是一个长度为 1 的数组,包含单个 int HEIGHT
。
访问 AVFrame的每个像素都会以较少的细节提出相同的问题,目前尚未得到解答。
流光发出一个警告,我怀疑这会影响外观:
[rtp @ 0x269c0a0] Encoder did not produce proper pts, making some up.
所以。如何设置要发送到 sws_scale()(然后发送到 x264_encoder_encode() 和 av_interleaved_write_frame())的帧中像素的 RGB 值?