ffmpeg,264编码,得到码流有延迟。实时编码
ret = avcodec_encode_video2(c, &pkt, frame, &got_output); 编码开始后,等过了30多帧才会得到码流,got_output才有输出,之后就是每编码一帧都有输出。
导致接收端解码延迟了好几秒。
办法:
Low Latency
libx264 offers a -tune zerolatency option. See the StreamingGuide.
http://ffmpeg.org/trac/ffmpeg/wiki/x264EncodingGuide
http://ffmpeg.org/trac/ffmpeg/wiki/StreamingGuide
AVCodecContext *c 如此设置即可 av_opt_set(c->priv_data, "tune", "zerolatency", 0);
20140529,今天再次碰到编码延迟了15帧
if ((ret = avcodec_encode_video2(enc_ctx, &out_pkt,frame,&got_packet)) < 0)//out_pkt.data必须初始化为NULL,才能由编码器分配空间.用户分配则必须足够大
{
//av_log(NULL, AV_LOG_ERROR, "Error encoding video frame: %s\n", av_err2str(ret));
return false;
}
if (got_packet)
{}
第一帧开始ret返回的是0,说明编码成功,但是got_packet为0 ,没有码流输出,延迟了15帧之后才有输出。
解决办法 :av_opt_set(enc_ctx->priv_data, "tune", "zerolatency", 0);
原理参考:http://blog.sina.com.cn/s/blog_51396f890102f084.html
http://x264-settings.wikispaces.com/x264_Encoding_Suggestions