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

原文地址:https://www.cnblogs.com/mlj318/p/3068762.html