librtmp在rtmp-凯发app官方网站

凯发app官方网站-凯发k8官网下载客户端中心 | | 凯发app官方网站-凯发k8官网下载客户端中心
  • 博客访问: 1235545
  • 博文数量: 76
  • 博客积分: 1959
  • 博客等级: 上尉
  • 技术积分: 2689
  • 用 户 组: 普通用户
  • 注册时间: 2007-11-19 12:07
个人简介

樽中酒不空

文章分类

全部博文(76)

文章存档

2020年(4)

2019年(1)

2017年(2)

2016年(2)

2015年(7)

2014年(11)

2013年(13)

2012年(18)

2011年(2)

2010年(16)

相关博文
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·

分类: c/c

2013-04-24 14:22:08

librtmp库在rtmp_read阻塞,做成多线程时不方便,可以改成非阻塞:

跟踪代码,在
rtmp_read-->read_1_packet-->rtmp_getnextmediapacket里:


while (!bhasmediapacket && rtmp_isconnected(r)
&& rtmp_readpacket(r, packet))
{
...
     bhasmediapacket = rtmp_clientpacket(r, packet);


      if (!bhasmediapacket)
{
 rtmppacket_free(packet);
}
...
}


当没有收到数据时,相当于执行while(1),没有检测主动断开的事件。如果一直没有来数据,socket也不断,这就是个死循环了。rtmpdump是基于命令行的,可以直接ctrl-c退出了事,如果自己写一个重复的多路服务,这样不行,需要做非阻塞处理。

方法:
增加一个回调,检测是否需要中断:
在rtmp.h里增加一个结构体:
  typedef struct aviointerruptcb {
    int (*callback)(void*);
    void *opaque;
} aviointerruptcb;


在rtmp里增加一个变量:
aviointerruptcb interrupt_callback;


rtmp_init的时候:
r->interrupt_callback.opaque = null;
r->interrupt_callback.callback = null;


在外面使用的时候,先定义一个函数:
static int decode_interrupt_cb(void *ctx)
{
    myclass *is = (myclass *)ctx;
    return is->abort_request;
}


rtmp初始化:
r->interrupt_callback.callback = decode_interrupt_cb;
r->interrupt_callback.opaque = this;


为了省事,回调方法从ffplay里拿来的。





阅读(10879) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
")); function link(t){ var href= $(t).attr('href'); href ="?url=" encodeuricomponent(location.href); $(t).attr('href',href); //setcookie("returnouturl", location.href, 60, "/"); }
网站地图