当前位置: 代码迷 >> 多媒体/流媒体开发 >> x264 编码, ffmpeg 解码. 视频图像偏红。请大家帮帮解决有关问题,多谢
  详细解决方案

x264 编码, ffmpeg 解码. 视频图像偏红。请大家帮帮解决有关问题,多谢

热度:10015   发布时间:2013-02-26 00:00:00.0
x264 编码, ffmpeg 解码. 视频图像偏红。请大家帮帮解决问题,谢谢
我正在做视频编解码, 输入输出格式为YUY2, 在编码前要转成I420格式的,再编码, 解码后,转成YUV2格式的输出。这方面我不太懂, 请大家帮忙啊, 具体点最好了,谢谢
编码部分:
x264_picture_t pic_out;
x264_nal_t *nal = NULL;
int i_nal = 0;

int nFrameSize = x264_encoder_encode( m_pEncoder, &nal, &i_nal, &m_Pic, &pic_out );
if (( 0 > nFrameSize) || (0 >= i_nal))
{
return FALSE;
}

encresult.is_key_frame = pic_out.i_type==X264_TYPE_IDR;
encresult.total_bits = 0;

int i_size = 0;
int i_data = 0;

for(int i = 0; i < i_nal; i++ )
{
if( ( i_size = x264_nal_encode( lpOut, &i_data, 1, &nal[i]) ) > 0 )
{
lpOut += i_size;
encresult.total_bits += i_size;

}


解码部分:

  av_init_packet(&avpkt);

avpkt.data = lpData;
avpkt.size = iInLength;
iOutLength = 0;

while(avpkt.size > 0)
{
nlen = avcodec_decode_video2(m_CodecCtx, m_picture, &ngot_picture, &avpkt);

if (0 > nlen)
{
return;
}

if(ngot_picture)
{
avpicture_fill((AVPicture *)m_pFrameYUV, lpOut, PIX_FMT_YUYV422, m_CodecCtx->width, m_CodecCtx->height); 

static struct SwsContext *img_convert_ctx = NULL;
if (!img_convert_ctx)
{
img_convert_ctx = sws_getContext(m_CodecCtx->width, m_CodecCtx->height,
m_CodecCtx->pix_fmt,
m_CodecCtx->width, m_CodecCtx->height,
PIX_FMT_YUYV422,
SWS_BICUBIC, NULL, NULL, NULL);
}

sws_scale(img_convert_ctx, m_picture->data, m_picture->linesize,
0, m_CodecCtx->height, m_pFrameYUV->data, m_pFrameYUV->linesize);

//SaveAsBMP(m_pFrameYUV, m_CodecCtx->width, m_CodecCtx->height, 0, 24);
iOutLength = m_CodecCtx->width * m_CodecCtx->height * 3;


avpkt.data += nlen;
avpkt.size -= nlen;
}

------解决方案--------------------------------------------------------
应该是某个颜色的位置弄错了。
------解决方案--------------------------------------------------------
贴个图看看是怎么个变化
------解决方案--------------------------------------------------------
编码时m_Pic的UV数据弄错了。m_Pic赋值的关键代码没有贴出来,x264不是只支持I420(YV12中UV颠倒)吗?
下面是YV12输入编码初始化代码:

x264_picture_t pic_in;
memset(&pic_in, 0, sizeof(pic_in));

pic_in.i_type = X264_TYPE_AUTO;
pic_in.i_pts = rtStart;
pic_in.img.i_csp = X264_CSP_I420; // 输入编码格式
pic_in.img.i_plane = 3;
pic_in.img.plane[0] = pData;
pic_in.img.plane[2] = pic_in.img.plane[0] + m_x264_param.i_width * m_x264_param.i_height;
pic_in.img.plane[1] = pic_in.img.plane[2] + (m_x264_param.i_width / 2) * (m_x264_param.i_height / 2);
pic_in.img.i_stride[0] = m_x264_param.i_width;
pic_in.img.i_stride[1] = m_x264_param.i_width / 2;
pic_in.img.i_stride[2] = m_x264_param.i_width / 2;
  相关解决方案