织梦CMS - 轻松建站从此开始!

罗索

librtmp在RTMP_Read时阻塞的改进

落鹤生 发布于 2013-05-07 22:00 点击:次 
librtmp库在RTMP_Read阻塞,做成多线程时不方便,可以改成非阻塞
TAG:

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

跟踪代码,在

  1. RTMP_Read-->Read_1_Packet-->RTMP_GetNextMediaPacket里: 
  2.  
  3.  
  4. while (!bHasMediaPacket && RTMP_IsConnected(r) 
  5. && RTMP_ReadPacket(r, packet)) 
  6. ... 
  7.      bHasMediaPacket = RTMP_ClientPacket(r, packet); 
  8.  
  9.  
  10.       if (!bHasMediaPacket) 
  11.  RTMPPacket_Free(packet); 
  12. ... 

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

方法:
增加一个回调,检测是否需要中断:
在rtmp.h里增加一个结构体:

  1. typedef struct AVIOInterruptCB { 
  2.     int (*callback)(void*); 
  3.     void *opaque; 
  4. } AVIOInterruptCB; 

在RTMP里增加一个变量:

  1. AVIOInterruptCB interrupt_callback; 

RTMP_Init的时候:

  1. r->interrupt_callback.opaque = NULL; 
  2. r->interrupt_callback.callback = NULL; 

在外面使用的时候,先定义一个函数:

  1. static int decode_interrupt_cb(void *ctx) 
  2.     MYClass *is = (MYClass *)ctx; 
  3.     return is->abort_request; 

RTMP初始化:

  1. r->interrupt_callback.callback = decode_interrupt_cb; 
  2. r->interrupt_callback.opaque = this

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

(sxcong)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201305/16617.html]
本文出处:ChinaUnix 作者:sxcong 原文
顶一下
(1)
50%
踩一下
(1)
50%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容