iOS 使用AsyncSocket实现RTSP协议

iOS直播(五)进行推流 常见流媒体协议 iOS的推流协议,目前最为常用的是RTMP和HLS。RTMP是Adobe公司开发的基于TCP的应用层协议,实时性高,一般在3-5s。HLS(HTTP Live Streaming)是苹果公司开发的基于HTTP的流媒体传输协议,可实现流媒体的直播和点播,但是由于其原理是将视频流切割成一系列的HTTP下载文件再进行传输,所以HLS有较高的延迟(约30s)。传输内容包括M3U8描述文件和TS媒体文件。 阅读详情

所以选择了AsyncSocket来实现socket通信。另外实现了RTSP的通信过程,并在play命令之后,

再次开始一个UDP会话,用于传输数据。

  项目原型是用RTSP+RTP来实现摄像头的实时监控,RTSP使用TCP来实现,RTP使用UDP实现,

直接上代码吧!

关于怎么在项目中使用AysncSocket,请查看http://www.1000phone.net/thread-7781-1-1.htmlRTSPClient.h如下:

  1. //
  2. //  ViewController.m
  3. //  RTSPClient
  4. //
  5. //  Created by Fox on 12-3-11.
  6. //  Copyright (c) 2012年 __MyCompanyName__. All rights reserved.
  7. //
  8.  
  9. #import "RTSPClient.h"
  10. #import "AsyncSocket.h"
  11. #import "AsyncUdpSocket.h"
  12.  
  13.  
  14.  
  15. #define KENTER @"\r\n"
  16. #define KBLACK @" "
  17. #define MAX_BUF 10240
  18.  
  19.  
  20. static    NSString* SERVERADDR  = @"172.16.108.200";
  21. static  const  int  SERVERPORT = 554;
  22.  
  23.  
  24. @interface RTSPClient ()
  25.  
  26. @end
  27.  
  28. @implementation RTSPClient
  29.  
  30. - (void)viewDidLoad
  31. {
  32.      [super viewDidLoad];
  33.      // Do any additional setup after loading the view, typically from a nib.
  34.      
  35.      
  36.      socket = [[AsyncSocket alloc] initWithDelegate:self];
  37.      
  38.      [socket connectToHost:@"172.16.108.200" onPort:554 error:nil];
  39.      [self getOptions];
  40.      
  41.       
  42. }
  43.  
  44. - (void)viewDidUnload
  45. {
  46.      [super viewDidUnload];
  47.      // Release any retained subviews of the main view.
  48. }
  49.  
  50. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
  51. {
  52.      return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
  53. }
  54.  
  55.  
  56.  
  57.  
  58.  
  59.  
  60. #pragma mark RTSP Session
  61. /*
  62.   *建立连接,返回服务器对OPTIONS请求的响应
  63.   */
  64. -(NSMutableString*)getOptions
  65. {
  66.      
  67.      NSMutableString* options = [[NSMutableString alloc] init];
  68.      
  69.      [options appendFormat:@"OPTIONS rtsp://%@:%d/H264 RTSP/1.0%@",SERVERADDR,SERVERPORT,KENTER];
  70.      [options appendFormat:@"CSeq: 2%@",KENTER];
  71.      [options appendFormat:@"User-Agent: LibVLC/1.1.11 (LIVE555 Streaming Media v2011.05.25)%@%@",KENTER,KENTER];
  72.      
  73.      
  74.      [socket writeData:[options dataUsingEncoding:NSUTF8StringEncoding] withTimeout:3 tag:1];
  75.      NSMutableString* readString = [[NSMutableString alloc] init];
  76.      [socket readDataWithTimeout:3 tag:1];
  77.      
  78.      return readString;
  79. }
  80.  
  81. /*
  82.   *建立连接,返回服务器对DESCRIBE请求的响应
  83.   */
  84. -(NSMutableString*)getDescribe
  85. {
  86.      
  87.      NSMutableString* describe = [[NSMutableString alloc] init];
  88.      
  89.      [describe appendFormat:@"DESCRIBE rtsp://%@:%d/H264 RTSP/1.0%@",SERVERADDR,SERVERPORT,KENTER];
  90.      [describe appendFormat:@"CSeq: 3%@",KENTER];
  91.      [describe appendFormat:@"Authorization: Basic YWRtaW4=%@",KENTER];
  92.      [describe appendFormat:@"User-Agent: LibVLC/1.1.11 (LIVE555 Streaming Media v2011.05.25)%@",KENTER];
  93.      [describe appendFormat:@"Accept: application/sdp%@%@",KENTER,KENTER];
  94.      
  95.      
  96.      
  97.      [socket writeData:[describe dataUsingEncoding:NSUTF8StringEncoding] withTimeout:3 tag:1];
  98.      NSMutableString* readString = [[NSMutableString alloc] init];
  99.      [socket readDataWithTimeout:3 tag:2];
  100.      
  101.      
  102.      return readString;
  103. }
  104.  
  105. /*
  106.   *建立连接,返回通过tcp连接服务器对SETUP请求的响应
  107.   */
  108. -(NSMutableString*)getTcpSetup
  109. {
  110.      
  111.      
  112.      NSMutableString* tcpsetup = [[NSMutableString alloc] init];
  113.      
  114.      [tcpsetup appendFormat:@"SETUP rtsp://%@:%d/H264/track1 RTSP/1.0%@",SERVERADDR,SERVERPORT,KENTER];
  115.      [tcpsetup appendFormat:@"CSeq: 4%@",KENTER];
  116.      
  117.      [tcpsetup appendFormat:@"Authorization: Basic YWRtaW4=%@",KENTER];
  118.      [tcpsetup appendFormat:@"User-Agent: LibVLC/1.1.11 (LIVE555 Streaming Media v2011.05.25)%@",KENTER];
  119.      [tcpsetup appendFormat:@"Transport: RTP/AVP/TCP;unicast;interleaved=0-1%@%@",KENTER,KENTER];
  120.      
  121.      
  122.      
  123.      [socket writeData:[tcpsetup dataUsingEncoding:NSUTF8StringEncoding] withTimeout:3 tag:1];
  124.      NSMutableString* readString = [[NSMutableString alloc] init];
  125.      [socket readDataWithTimeout:3 tag:3];
  126.      
  127.      
  128.      return readString;
  129.      
  130. }
  131.  
  132. /*
  133.   *建立连接,返回通过udp连接服务器对SETUP请求的响应
  134.   */
  135. -(NSMutableString*)getUdpSetup
  136. {
  137.      
  138.      NSMutableString* udpsetup = [[NSMutableString alloc] init];
  139.      
  140.      [udpsetup appendFormat:@"SETUP rtsp://%@/H264/track1 RTSP/1.0%@",SERVERADDR,KENTER];
  141.      [udpsetup appendFormat:@"CSeq: 4%@",KENTER];
  142.      [udpsetup appendFormat:@"Authorization: Basic YWRtaW4=%@",KENTER];
  143.      [udpsetup appendFormat:@"User-Agent: LibVLC/1.1.11 (LIVE555 Streaming Media v2011.05.25)%@",KENTER];
  144.      [udpsetup appendFormat:@"Transport: RTP/AVP;unicast;client_port=7777-7778%@%@",KENTER,KENTER];
  145.      
  146.      
  147.      
  148.      [socket writeData:[udpsetup dataUsingEncoding:NSUTF8StringEncoding] withTimeout:3 tag:1];
  149.      NSMutableString* readString = [[NSMutableString alloc] init];
  150.      [socket readDataWithTimeout:3 tag:3];    
  151.      
  152.      
  153.      return readString;
  154.      
  155. }
  156.  
  157. /*
  158.   *建立连接,返回向服务器对PLAY请求的响应
  159.   */
  160. -(NSMutableString*)getPlay:(NSString*)session
  161. {
  162.      
  163.      NSMutableString* play = [[NSMutableString alloc] init];
  164.      
  165.      [play appendFormat:@"PLAY rtsp://%@/H264 RTSP/1.0%@",SERVERADDR,KENTER];
  166.      [play appendFormat:@"CSeq: 5%@",KENTER];
  167.      [play appendFormat:@"Range: npt=0.000-%@",KENTER];
  168.      [play appendFormat:@"Session:%@%@",session,KENTER];
  169.      [play appendFormat:@"User-Agent: LibVLC/1.1.11 (LIVE555 Streaming Media v2011.05.25)%@%@",KENTER,KENTER];
  170.      
  171.      
  172.      
  173.      [socket writeData:[play dataUsingEncoding:NSUTF8StringEncoding] withTimeout:3 tag:1];
  174.      NSMutableString* readString = [[NSMutableString alloc] init];
  175.      [socket readDataWithTimeout:3 tag:4]; 
  176.      
  177.      
  178.      return readString;
  179.      
  180. }
  181.  
  182.  
  183.  
  184. /*
  185.   *建立连接,返回向服务器对TEARDOWN请求的响应
  186.   */
  187. -(NSMutableString*)getTeardown:(NSString*)session
  188. {
  189.      
  190.      NSMutableString* teardown = [[NSMutableString alloc] init];
  191.      
  192.      [teardown appendFormat:@"TEARDOWN rtsp://%@:%d/H264 RTSP/1.0%@",SERVERADDR,SERVERPORT,KENTER];
  193.      [teardown appendFormat:@"CSeq: 5%@",KENTER];
  194.      [teardown appendFormat:@"Session:%@%@",session,KENTER];
  195.      [teardown appendFormat:@"User-Agent: LibVLC/1.1.11 (LIVE555 Streaming Media v2011.05.25)%@%@",KENTER,KENTER];
  196.      
  197.      
  198.      [socket writeData:[teardown dataUsingEncoding:NSUTF8StringEncoding] withTimeout:3 tag:1];
  199.      NSMutableString* readString = [[NSMutableString alloc] init];
  200.      [socket readDataWithTimeout:3 tag:5];     
  201.      return readString;
  202.      
  203. }
  204.  
  205. /*
  206.   *返回服务器地址
  207.   */
  208. -(NSString*)getServeraddr
  209. {
  210.      return SERVERADDR;
  211. }
  212.  
  213. /*
  214.   *返回RTSP回话标识,info为客户端向服务器发送setup请求时的响应信息
  215.   */
  216. -(NSString*)getSession:(NSString*)info
  217. {
  218.      
  219.      //从文件中再一行一行读取数据,将包含session的一行保留出来
  220.      NSString *tmp; 
  221.      NSArray *lines; /*将文件转化为一行一行的*/ 
  222.      lines = [info componentsSeparatedByString:@"\r\n"];
  223.      
  224.      NSEnumerator *nse = [lines objectEnumerator]; 
  225.      NSString* session = [[NSString alloc] init];
  226.      while(tmp = [nse nextObject]) { 
  227.          if ([tmp hasPrefix:@"Session:"]) {
  228.              //tmp为包含session那一行的
  229.              NSInteger len = @"Session:".length;
  230.              session = [[tmp substringFromIndex:len] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
  231.              NSLog(@"Session:%@\n",session);   
  232.              break;
  233.          }
  234.      }
  235.      
  236.      return  session;
  237.      
  238. }
  239.  
  240. /*
  241.   *返回RTSP回话的Content-Base
  242.   */
  243. -(NSString*)getContentBase:(NSString*)info
  244. {
  245.      //info为Describe请求所响应的信息
  246.      NSString *tmp; 
  247.      NSArray *lines; /*将文件转化为一行一行的*/ 
  248.      lines = [info componentsSeparatedByString:@"\r\n"];
  249.      
  250.      NSEnumerator *nse = [lines objectEnumerator]; 
  251.      NSString* contentbase = [[NSString alloc] init];
  252.      while(tmp = [nse nextObject]) { 
  253.          if ([tmp hasPrefix:@"Content-Base:"]) {
  254.              //tmp为包含session那一行的
  255.              NSInteger len = @"Content-Base:".length;
  256.              contentbase = [[info substringFromIndex:len] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
  257.              NSLog(@"Content-Base:%@\n",contentbase);   
  258.              break;
  259.          }
  260.      }
  261.      
  262.      return  contentbase;
  263.      
  264. }
  265.  
  266.  
  267. /*
  268.   *返回RTSP回话的Content-Type
  269.   */
  270. -(NSString*)getContentType:(NSString*)info
  271. {
  272.      
  273.      //info为Describe请求所响应的信息
  274.      NSString *tmp; 
  275.      NSArray *lines; /*将文件转化为一行一行的*/ 
  276.      lines = [info componentsSeparatedByString:@"\r\n"];
  277.      
  278.      NSEnumerator *nse = [lines objectEnumerator]; 
  279.      NSString* contenttype = [[NSString alloc] init];
  280.      while(tmp = [nse nextObject]) { 
  281.          if ([tmp hasPrefix:@"Content-Type:"]) {
  282.              //tmp为包含session那一行的
  283.              NSInteger len = @"Content-Type:".length;
  284.              contenttype = [[info substringFromIndex:len] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
  285.              NSLog(@"CContent-Type:%@\n",contenttype);   
  286.              break;
  287.          }
  288.      }
  289.      
  290.      return  contenttype;
  291.      
  292. }
  293.  
  294.  
  295.  
  296. /*
  297.   *返回RTSP回话的contentlength
  298.   */
  299. -(NSString*)getContentLength:(NSString*)info
  300. {
  301.      
  302.      //info为Describe请求所响应的信息
  303.      NSString *tmp; 
  304.      NSArray *lines; /*将文件转化为一行一行的*/ 
  305.      lines = [info componentsSeparatedByString:@"\r\n"];
  306.      
  307.      NSEnumerator *nse = [lines objectEnumerator]; 
  308.      NSString* contentlength = [[NSString alloc] init];
  309.      while(tmp = [nse nextObject]) { 
  310.          if ([tmp hasPrefix:@"Content-Type:"]) {
  311.              //tmp为包含session那一行的
  312.              NSInteger len = @"Content-Type:".length;
  313.              contentlength = [[info substringFromIndex:len] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
  314.              NSLog(@"CContent-Type:%@\n",contentlength);   
  315.              break;
  316.          }
  317.      }
  318.      return  contentlength;    
  319. }
  320.  
  321. /*
  322.   *本机作为客户端连接接受服务器发送的消息
  323.   */
  324. -(void)RecvUDPData{
  325.      
  326.      socketudp = [[AsyncUdpSocket alloc] initWithDelegate:self];
  327.     
  328.      [socketudp bindToPort:7777 error:nil];
  329.      [socketudp enableBroadcast:YES error:nil];//设置为广播
  330.      
  331.      if ([socketudp connectToHost:@"172.16.108.200" onPort:6970 error:nil]) {
  332.              [socketudp receiveWithTimeout:-1 tag:1];//将不断接受摄像头发送的数据
  333.      }
  334.           
  335. }
  336.  
  337. #pragma mark AsyncSocketDelegate
  338. /*
  339.   *通过主机名和端口号连接服务器
  340.   */
  341. - (void)onSocket:(AsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port{
  342.      NSLog(@"did connect to host");
  343. }
  344. /*
  345.   *向内存中写入数据
  346.   */
  347. - (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag{
  348.      NSString *message;
  349.      NSString* info = [[NSString alloc] init];
  350.      switch (tag) {
  351.          case 1:
  352.              NSLog(@"getOptions:did read data");
  353.              message = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
  354.              NSLog(@"message is: \n%@",message);
  355.              [self getDescribe];
  356.              break;
  357.          case 2:
  358.              NSLog(@"getDescribe:did read data");
  359.              message = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
  360.              NSLog(@"message is: \n%@",message);
  361.              info = [self getUdpSetup];
  362.              break;  
  363.          case 3:
  364.              NSLog(@"getUdpSetup:did read data");
  365.              message = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
  366.              NSLog(@"message is: \n%@",message);
  367.              NSString* session = [self getSession:info];
  368.              [self getPlay:session];
  369.              break; 
  370.          case 4:
  371.              NSLog(@"getPlay:did read data");
  372.              message = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
  373.              NSLog(@"message is: \n%@",message);
  374.              [self RecvUDPData];
  375.              break; 
  376.          case 5:
  377.              NSLog(@"getTeardown:did read data");
  378.              message = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
  379.              NSLog(@"message is: \n%@",message);
  380.              break; 
  381.          default:
  382.              break;
  383.      }
  384.      
  385.      
  386.      
  387. }
  388.  
  389.  
  390.  
  391.  
  392. #pragma mark AsyncUdpSocketDelegate
  393. - (BOOL)onUdpSocket:(AsyncUdpSocket *)sock didReceiveData:(NSData *)data withTag:(long)tag fromHost:(NSString *)host port:(UInt16)port
  394. {
  395.      NSLog(@"333333333");
  396.      NSString *theLine=[[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]; //Convert the UDP data to an NSString
  397.      
  398.      NSLog(@"%@", theLine);
  399.      
  400.      [theLine release];
  401.      
  402.      [socketudp receiveWithTimeout:-1 tag:1]; 
  403.  
  404.      
  405.      return YES;     
  406.      
  407. }
  408.  
  409.  
  410. @end
复制代码
建立UDP会话后,摄像头开始向客户端发送RTP数据包,多包构成一帧数据,然后进行解码显示。
ios rtsp rtmp流媒体播放器 ios rtsp rtmp流媒体播放器,代码的架构跟kxmovie差不多,但我真实实验过好多kxmovie代码播放rtmp并不能很好的实时播放,后来看了这个播放还是很好,希望对你们有用,本人就是做ios流媒体这一块的,稍微要点资源分。 立即下载

相关推荐

iOS FFmpeg播放RTSP流的Demo

工程是FFmpeg播放RTSP流的一个Demo,FFmpeg是自己编译的,时候监控项目目前只实现了图像显示没有实现声音播放

iOS平台如何实现RTSP|RTMP播放端录像?

我们在做RTSP、RTMP直播播放器的时候,有个比较重要的功能,就是拉流端实时录像,包括设置单个录像文件大小、文件前缀、audio转AAC、只录制视频或只录制音频、开始录像、停止录像事件状态回调等。RTSP、RTMP播放端录像,我们的设计,是播放和录像分离,可以只录像或只播放,如果同时录像和播放,只需要一个拉流实例来完成。

大牛直播SDK 1352

H264-RTSP-Server-iOS实时视频流输出

录制摄像头并实时转成rtsp直播流 内建rtsp server,可进行跨平台直播

【亲测免费】 EasyPlayer-RTSP-iOS: iOS上的高效实时流播放器

EasyPlayer-RTSP-iOS: iOS上的高效实时流播放器 项目简介 是一个针对iOS平台开发的开源实时流媒体播放器库。它基于AVFoundation框架,并针对RTSP(Real Time Streaming Protocol)协议进行了优化,为开发者提供了一种简单、高效的解决方案,用于在iOS应用中播放RTSP视频流。 技术分析 EasyPlayer-RTSP-iOS的核心特性在于其...

gitblog_00033的博客 1724

RTSP协议的实时视频服务器实现

RTSP协议的实时视频服务器实现. 关于RTSP的资料。

接入 deepseek 实现AI智能问诊

必须包含user角色,用于传递用户输入。system角色可选,用于设置对话背景。多轮对话需要将历史记录添加到messages中。

weixin_51326478的博客 6541

iOS ijkplayer添加录像、rtsp、https、编译、集成framework及简单使用

1,GitHub上clone ijkplayer源码,切换分支到0.8.8 $ git clone https://github.com/Bilibili/ijkplayer.git ijkplayer-ios //进入ijkplayer-ios $ cd ijkplayer-ios //切换分支 $ git checkout -B latest k0.8.8 2,添加RTSP和HTTPS支持 开启支持RTSP,默认不支持RTSP,需要修改module-lite.sh内容,新增对应的协议,module-l

lichuanliangios的专栏 7611

信号完整性SI-PI

SI设计的主要难点在于需要综合信号的幅度、噪声、边沿、延时等影响信号质量的多种因素,并且这种因素常常相互依赖、互相影响,交叉在一起。1.1、信号过冲 (欠阻尼状态,可并联一个合适的电容):过冲会造成强烈的电磁干扰,另一方面会损伤后面的电路的输入及,甚至失效。信号完整性SI:是指电路系统中信号的质量,如果在要求的时间内,信号能不失真的从源端传输到接收端。优点:提供较慢的上升时间,减少反系量,产生更小的EMI,从而降低过冲,增加信号质量。导线之间的间距过小, 就会产生串扰,间距越小、串扰越大。

weixin_42304393的博客 4869

iOS平台如何实现毫秒级延迟的RTMP|RTSP播放器

iOS平台播放,由于设备和系统比较单一,所以优先考虑硬解码,除了基础播放外,我们还实现了实时快照、实时录像、实时回调YUV数据、实时音量调节等,实际体验下来,iOS平台RTMP和RTSP,可以轻松毫秒级,感兴趣的开发者,可以和我单独交流。

大牛直播SDK 2125

如何在R语言中使用Logistic回归模型

在日常学习或工作中经常会使用线性回归模型对某一事物进行预测,例如预测房价、身高、GDP、学生成绩等,发现这些被预测的变量都属于连续型变量。然而有些情况下,被预测变量可能是二元变量,即成功或失败、流失或不流失、涨或跌等,对于这类问题,线性回归将束手无策。这个时候就需要另一种回归方法进行预测,即Logistic回归。 在实际应用中,Logistic模型主要有三大用途: 1)寻找危险因素,找到某些影响...

weixin_34056162的博客 9552

银河麒麟V10 SP3系统下如何安全安装gcc-toolset-10(附yum仓库避坑指南)

本文详细介绍了在银河麒麟V10 SP3系统中安全部署gcc-toolset-10的完整方案。核心在于通过配置默认禁用的yum仓库(如EPKL仓库)并配合--enablerepo参数进行精准安装,有效规避依赖冲突风险,实现与系统默认GCC 7.3的稳定共存。文章还提供了多版本环境切换、系统维护及故障排查的实用指南,确保操作的可控与可逆。

h0i1j2k3l的博客 589

使用AsyncSocket实现RTSP协议

http://www.cnblogs.com/foxmin/archive/2012/03/12/2392523.html   之前Socket一直使用Linux c来实现,优点是很容易掌握socket的通信流程,缺点是过程比较繁琐。 所以选择了AsyncSocket来实现socket通信。另外实现了RTSP的通信过程,并在play命令之后, 再次开始一个UDP会话,

leonpengweicn的专栏 2125

从SIGGRAPH审稿人视角看:什么样的TOG论文更容易被接收?

本文从SIGGRAPH审稿人视角深入解析TOG论文的审稿标准与投稿策略,揭示如何提升论文接收概率。重点探讨创新性、技术深度、实验验证等核心评分维度,并提供写作技巧与审稿意见应对策略,帮助研究者优化ACM Transactions on Graphics投稿质量。

weixin_33721344的博客 108

IOS开发之使用RTSP协议读取海康摄像头

公司的一个项目中需要调用海康摄像头,但是由于海康的SDK只是提供了萤石云系列的摄像头,也就是说普通的摄像头是无法访问的,在网上找了好多资料没发现可用的SDK。结果发现了另一个思路:使用RTSP协议来读取视频流,这是一个比较新颖的思路,这样就不用使用sdk这种方式需要对不同的摄像头进行多次开发,但是要求你想要访问的摄像头要支持RTSP这个协议,同时你还需要知道你需要访问的摄像头的RTSP协议的格式。

zhaoxiaoyao1987的专栏 1万+

9、傅里叶变换:连续时间与离散时间信号分析的核心工具

本文深入探讨了傅里叶变换在连续时间和离散时间信号分析中的核心作用,详细介绍了连续时间傅里叶变换(CTFT)和离散时间傅里叶变换(DTFT)的定义、性质及其应用。文章涵盖了傅里叶级数到傅里叶变换的推导过程、常见变换对、系统分析中的关键性质,并讨论了采样后频谱的周期延拓与混叠问题。此外,还展示了傅里叶变换在滤波器设计、通信系统调制解调等实际场景中的应用,最后展望了其在图像处理、生物医学等领域的广阔前景。

jump7的博客 67

MGC3130 3D手势识别传感器原理图设计,已量产(交互传感器)

最近在落地一款互动艺术装置的控制模块,选了 Microchip 的 MGC3130 做核心 —— 这颗芯片算是 GestIC® 近场传感技术的 “熟面孔” 了,把 3D 手势识别、运动跟踪的信号处理都集成在一颗芯片里,0-10cm 的检测距离刚好适配桌面级互动场景,挥挥手就能控设备的体验,放在艺术装置里确实很出效果。今天扒一下实际跑通的原理图,聊聊每个模块的设计思路。

不脱发的程序猿 369

iOS平台RTSP|RTMP直播播放器技术接入说明

iOS平台RTSP、RTMP直播播放模块,延迟低、资源占有少,性能优异。由于设备和系统比较单一,优先考虑硬解码,除了基础播放外,我们还实现了实时快照、实时录像、实时回调YUV数据、实时音量调节等,实际体验下来,iOS平台RTMP和RTSP,可以轻松毫秒级。

大牛直播SDK 3320

YOLOv8工业缺陷检测实战:攻克光照不均难题,精度从70%到92%的全流程优化(附缺陷数据集)

YOLOv8在工业缺陷检测中突破光照不均难题,核心是“硬件控光+数据造景+模型聚焦+训练攻坚硬件控光:从源头减少光照变异,降低算法难度;数据造景:用CLAHE、合成样本让模型“见过足够多的光照情况”;模型聚焦:用ECA注意力和Focal-EIoU损失,让模型盯住缺陷而非光照;训练攻坚:分阶段+难例挖掘,强迫模型学习薄弱点。这套方案已在汽车轴承、手机外壳、PCB板3类产线落地,平均精度提升20%+,漏检率控制在0.08%以内,完全满足工业级要求。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1195

ios 如何播放RTSP视频流

http://bbs.youkuaiyun.com/topics/390833116 目前在做一个项目,是服务器端获取摄像头的视频,用H264编码,然后通过RTSP发送出来,我做的是IOS上的客户端,接收服务器发送过来的RTSP视频流,然后在IOS设备上播放。 目前我在  https://github.com下载了KXMovie(基于ffmpeg的iOS播放器),这个播放器目前是可以实现这个功

mengzhengjie的专栏 4548

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

iOS Video Streaming(收集,整理)

一、HTTP(WebService) 基于HTTP的渐进下载Progressive Download流媒体播放仅是在完全下载后再播放模式基础上做了一些小的改进。与下载播放模式中必须等待整个文件下载完毕后才能开始播放不同,渐进下载客户端在开始播放之前仅需等待一段较短的时间用于下载和缓冲该媒体文件最前面的一部分数据,之后便可以一边下载一边播放。在正式开始播放之前的这一小段缓冲应使得后续即使在网络较为

洛阳如是 958

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

EasyPlayer-RTSP-iOS: iOS上的实时流媒体播放器解决方案

EasyPlayer-RTSP-iOS: iOS上的实时流媒体播放器解决方案 去发现同类优质开源项目:https://gitcode.com/ 项目简介 是一个开源的iOS应用程序,专为播放RTSP(Real Time Streaming Protocol)视频流而设计。该项目由TsingSee团队开发并维护,旨在提供一个简单、高效且易于集成的解决方案,让开发者能够快速地在他们的iOS应用中实现R...

gitblog_00058的博客 949

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

从零开始集成:大牛直播SDK RTSP与RTMP模块在iOS平台的实现

大牛直播SDK为iOS平台提供高性能RTSP/RTMP播放解决方案,支持超低延迟播放(可低至500ms)和多种解码模式。本文详细介绍了SDK集成步骤:1)环境准备(iOS9+,arm64架构);2)关键配置包括解码模式(硬解/软解)、RTSP传输协议(TCP/UDP)、低延迟模式等;3)播放控制与事件处理机制;4)高级功能如YUV数据回调、本地录制等。该SDK以全自研内核实现稳定播放,适用于直播、视频会议等场景,文档包含完整代码示例和常见问题解决方案。(149字)

大牛直播SDK 1625

iOS 自定义 RTSP 视频播放器(支持全屏播放)

本文介绍了在iOS平台上实现自定义RTSP视频播放器的方法,重点支持全屏播放功能。采用MobileVLCKit(3.7.3)作为核心播放库,通过CocoaPods集成。实现方案包含:1)使用fullScreenCover实现全屏切换;2)支持横竖屏自动旋转;3)共享渲染视图避免画面卡顿;4)通过延迟暂停/播放解决全屏关闭时的黑屏问题。关键组件包括RTSPPlayerViewModel管理播放状态、VideoPlayerUIView作为播放器容器、FullScreenVideoView处理全屏显示。文章还提供

qq_45707357的博客 378

Windows PC、 Linux、 Android、 iOS多平台支持H5无插件播放RTSP摄像机解决方案

Windows PC、 Linux、 Android、 iOS多平台支持 H5无插件播放RTSP摄像机解决方案

OpenSkeye的博客 1万+
上一篇: iOS 常用开源类库和下载地址
下一篇: (iOS)基于XMPP协议的简单IM实现
KingOfTheCoders
博客等级 码龄12年 1粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值