音视频5、libavformat-3

8、设置I/O中断机制

    在 demux 时,我们首先需要调用 avformat_open_input() 打开一个输入,然后循环调用 av_read_frame() 函数来读取输入。
    我们要注意的是: avformat_open_input() 和 av_read_frame() 都是阻塞函数,如果不能读取到足够的数据,那么它们将会一直阻塞。对于读取本地文件而言,这不是什么问题,但当我们读取的是网络上的实时流时,尤其是网络的情况不太好的情况下,就可能导致这个长时间的阻塞。
    而在实际的代码中,我们可能不能让它们一直阻塞在这里,我们需要超过一定时长时返回,去处理其他一些事情,然后再尝试去重新调用这两个函数,去读取数据,这时候,我们就需要设置中断机制。
    第一种方法是,使用 option 来设置中断,不同的协议需要使用的 option 也不太一样,比如 rtsp ,它使用私有选项 stimeout 设置中断,tcp 使用私有选项 timeout 设置中断等等。使用时,需要去查询相关协议的具体说明。
//设置rtsp超时
AVDictionary* opts = NULL;
//设置tcp or udp,默认一般优先tcp再尝试udp
av_dict_set(&opts, "rtsp_transport",  "tcp" 或"udp", 0);
av_dict_set(&opts, "stimeout", "1000000", 0);//设置超

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