librtmp改成异步

一 一般推流客户端模型
推流客户端分为两个线程,一个线程采集数据,放到缓冲区,另一个线程发送rtmp消息,一个rtmp消息
是一个flv tag,也就是一帧。
如果推送线程阻塞卡住,会导致公共数据缓冲区满,从而导致数据帧不连续,
由于h264帧之间是前后依赖参考的,所以直接会导致播放异常。


二 解决办法
把librtmp改成异步,发送失败马上重新初始化rtmp链接,
从头开始推送数据。

三 附上代码
int RTMP_SwitchToNonBlocking(RTMP *r)
{
    //http mode do not open the non-blocking.
if (r->m_sb.sb_socket != -1 && !(r->Link.protocol & RTMP_FEATURE_HTTP)){
int val = 0;
    int fd_ = r->m_sb.sb_socket;


    if ((val = fcntl(fd_,F_GETFL,0)) < 0)
    {
        return -1;
    }


    val |= O_NONBLOCK;
    if (fcntl(fd_,F_SETFL,val) == -1)
    {
        return -1;
    }
r->m_switchToNonBlock = 1;
return 1;
}


你可能感兴趣的:(音视频)