- 浏览: 145417 次
- 性别:
- 来自: 广州
最新评论
-
yinren13:
说的便捷的视频会议,我们公司的遥控器一按就能开始的视频会议tu ...
便捷视频会议 -
xujinquan19:
...
可视通讯与移植、跨平台开发 -
xujinquan19:
...
Android 平台下的即时通讯 -
xujinquan19:
...
Android 平台下的即时通讯 -
xujinquan19:
...
Android 平台下的即时通讯
ios没有直接得api用来封装传输rtp,但是经常有用到得接收过来得音视频数据,经过X264处理转换便可以封装为Rtp包进行直接发送。大家可以看代码:
复制代码
- #include "rtpsession.h"
- #include "rtppacket.h"
- #include "rtpudpv4transmitter.h"
- #include "rtpipv4address.h"
- #include "rtpsessionparams.h"
- #include "rtperrors.h"
- @interface VideoRTPPack : NSObject<SocketHandlerDelegate>
- {
- RTPSession m_RTPSession;
-
- NSMutableDictionary *dicDataBuffer;
- }
- @property(nonatomic, retain) NSMutableDictionary *dicDataBuffer;
- - (id)initWithVideoRTP:(NSString *)hostIP onPort:(unsigned short)port;
- - (void)createVideoRTP:(NSString *)host onPort:(unsigned short)port;
- - (void)SendVideoPacket:(unsigned char*)videoData
- Nal:(int)_nal
- Size:(size_t)videoDataSize
- User:(unsigned long)user_id
- FrameID:(int)video_frame_id;
- - (void)resendSubPacketData:(int)frameID withSubPack:(int)packID;
- - (void)closeVideoRTP;
- @end
- #import "VideoRTPPack.h"
- @implementation VideoRTPPack
- @synthesize dicDataBuffer;
- - (id)initWithVideoRTP:(NSString *)hostIP onPort:(unsigned short)port
- {
- if (self = [super init])
- {
- [self createVideoRTP:hostIP onPort:port];
-
- dicDataBuffer = [[NSMutableDictionary alloc] init];
- }
-
- return self;
- }
- - (void)dealloc
- {
- KLC_RELEASE_SAFELY(self.dicDataBuffer)
-
- [super dealloc];
- }
- - (void)createVideoRTP:(NSString *)host onPort:(unsigned short)port
- {
- RTPUDPv4TransmissionParams m_VideoTransparams;
- RTPSessionParams m_VideoSessionparams;
-
- m_VideoSessionparams.SetOwnTimestampUnit(1.0/10.0);
- m_VideoSessionparams.SetAcceptOwnPackets(TRUE);
- m_VideoSessionparams.SetUsePollThread(0);
- m_VideoTransparams.SetPortbase(port);
-
- int nStatus = m_RTPSession.Create(m_VideoSessionparams, &m_VideoTransparams);
- if(nStatus < 0)
- {
- NSLog(@"create rtp faild!");
- return;
- }
-
- unsigned long ipAddress = ntohl(inet_addr([host UTF8String]));
-
- RTPIPv4Address JRTPVideoAddr(ipAddress, port);
- nStatus = m_RTPSession.AddDestination(JRTPVideoAddr);
- if(nStatus < 0)
- {
- NSLog(@"add destination faild!");
- return;
- }
-
- m_RTPSession.SetDefaultPayloadType(96);
- m_RTPSession.SetDefaultMark(FALSE);
- m_RTPSession.SetDefaultTimestampIncrement(160);
- }
- - (void)SendVideoPacket:(unsigned char*)videoData
- Nal:(int)_nal
- Size:(size_t)videoDataSize
- User:(unsigned long)user_id
- FrameID:(int)video_frame_id
- {
- NSLog(@"video_frame_id = %d", video_frame_id);
-
- unsigned short length = 0;
- int subPackIndex = 1;
- int i_video_loop = 0, offset = 0, video_pack_len = 0;
- NSMutableArray *subPackArray = [[NSMutableArray alloc] init];
-
- MSQ_PACK_MID msq_pack_mid;
- strcpy(msq_pack_mid.msq_head.AppName, GAppName);
- msq_pack_mid.msq_head.sTransType = htons(TRANSTYPE_CLIENTTOSERVER);
- msq_pack_mid.msq_head.sDataType = htons(SENDSTREAM_VIDEO_DATATYPE);
- msq_pack_mid.msq_head.lSendID = htonl(user_id);
-
- i_video_loop = videoDataSize / VIDEO_PACKET_SIZE;
- if ((videoDataSize % VIDEO_PACKET_SIZE) > 0) i_video_loop ++;
-
- while (videoDataSize)
- {
- VideoPacket *pVideoPacket = (VideoPacket*)msq_pack_mid.msq_data;
-
- pVideoPacket->PacketHead.TotalPackets = i_video_loop;
- pVideoPacket->PacketHead.subpacketindex = subPackIndex;
- pVideoPacket->PacketHead.sOffset = htons(offset);
-
- video_pack_len = (videoDataSize < VIDEO_PACKET_SIZE) ? videoDataSize:VIDEO_PACKET_SIZE;
- pVideoPacket->PacketHead.sDataLength = htons(video_pack_len);
- videoDataSize = videoDataSize - video_pack_len;
-
- pVideoPacket->PacketHead.lFrameID = htonl(video_frame_id);
- pVideoPacket->PacketHead.timeStart = 0;
- pVideoPacket->PacketHead.timeEnd = 0;
- pVideoPacket->PacketHead.s_nal = _nal;
-
- memcpy(pVideoPacket->rawData, videoData+offset, video_pack_len);
- offset = offset + video_pack_len;
-
- length = sizeof(VideoPacketHead) + video_pack_len;
-
- msq_pack_mid.msq_head.sTCPLength = htons(length);
- msq_pack_mid.msq_head.sDataLength = msq_pack_mid.msq_head.sTCPLength;
-
- NSData *subData = [NSData dataWithBytes:(void *)&msq_pack_mid length:sizeof(MSQ_HEAD)+length];
- [subPackArray addObject:subData];
-
- m_RTPSession.SendPacket(&msq_pack_mid, sizeof(MSQ_HEAD)+length);
-
- subPackIndex ++;
- }
-
- // 把视频数据存入缓冲区
- if ([[self.dicDataBuffer allKeys] count] < 50)
- {
- [self.dicDataBuffer setObject:subPackArray
- forKey:[NSNumber numberWithInt:video_frame_id]];
- }
- else
- {
- [self.dicDataBuffer removeObjectForKey:[NSNumber numberWithInt:video_frame_id-51]];
- [self.dicDataBuffer setObject:subPackArray
- forKey:[NSNumber numberWithInt:video_frame_id]];
- }
-
- KLC_RELEASE_SAFELY(subPackArray)
- }
- - (void)resendSubPacketData:(int)frameID withSubPack:(int)packID
- {
- NSArray *lostArray = (NSArray *)[self.dicDataBuffer objectForKey:[NSNumber numberWithInt:frameID]];
- NSData *lostData = [lostArray objectAtIndex:packID-1];
-
- int nStatus = m_RTPSession.SendPacket([lostData bytes], [lostData length]);
- if (nStatus == 0) NSLog(@"ReSend Packet Data Succeed!");
- }
- - (void)closeVideoRTP
- {
- if (m_RTPSession.IsActive())
- {
- m_RTPSession.Destroy();
- }
- }
- @end
demo程序如附件中
- iPhone视频聊天V1.2.rar (8.2 MB)
- 下载次数: 30
发表评论
-
手机视频会议
2012-11-16 14:03 812在这个时代,手机被开发者们所赋予的意义已经远远超出了大众的期望 ... -
视频通讯demo源码
2012-11-09 15:23 1102以下为anychat视频通讯系统中的部分回调函数源码: 具体 ... -
音视频对话开发
2012-09-20 17:21 711AnyChat for Android是佰锐科技继2010年发 ... -
H.264视频编码标准在网络视频监控系统中的应用 .
2012-08-24 15:13 910【摘 要】本文介绍了ITU-T最新高性能视频压缩标准H.264 ... -
安卓平台下的即时通讯
2012-08-24 15:12 939基于Android 平台简易即时通讯的研究与设计 摘要 ... -
手机音视频应用开发(专注于Symbian、iPhone、Android等跨平台音视频应用开发方案)
2012-08-24 14:47 1115一款好的手机应用, 能让用户在第一分钟就爱上他, 一款烂的手 ... -
手机视频通讯开发
2012-08-24 14:46 787如今,3G网络快速发展 ... -
android视频开发
2012-08-16 17:31 986摘要:论文简单介绍Android 平台的特性,主要阐述了基于A ... -
android视频聊天软件推荐
2012-08-15 17:00 1028正在当前那个社会 ... -
音视频交流服务系统
2012-03-15 16:22 876下面的这个平台是一种视频服务的应用,比如A(客户端)打视频电话 ... -
音视频开发平台
2012-03-15 16:12 805近日,腾讯公司发布了Q ... -
即时通讯开发平台(音视频)
2012-03-15 16:11 899近日,腾讯公司发布了Q ... -
手机视频之营销模式
2012-02-16 10:43 8703G时代的逼近,手机视 ... -
手机视频应用开发
2011-12-30 14:56 751AnyChat for Android是佰锐科技继2010年发 ... -
Android视频通话(即时通讯,可视电话,视频通讯,监控,电视直播)推荐
2011-06-22 15:21 2008正在当前那个社会里,相信良多伴侣都是独自一人正在中地拼搏,好久 ... -
安卓视频通讯与监控系统完全版本正式发布
2011-05-04 17:12 1081通过数个月的研发,视频通讯安卓版本的程序已经出来了。 ... -
LINUX常用命令
2011-04-22 15:22 632Linux 系统常用命令格 ... -
Linux网络编程
2011-04-22 15:17 661Linux网络编程 linux socket的 ... -
GCC对ARM支持的所有优化选项及指令
2011-04-22 15:11 19703.17.1 ARM Options These `-m' ... -
3G手机视频即时通讯开发平台(跨平台,多系统)
2011-04-13 11:43 920介绍: 一、系统概述 “佰锐3 ...
相关推荐
IOS SQLITE数据库访问与使用demo
iOS音视频硬件编码源码,iOS原生不包含任何三方库音视频编码源码demo,音频编码使用AudioToolbox, 视频编码使用VideoToolbox
iOS 萤石云摄像头视频demo
ios应用源码之录制音频 demo recording .
iOS/android视频通话/直播软件,视频编码器采用h264,经过优化的,码率低,cpu占用率低。音频采用aac。传输采用rtp,视频通话有进行丢包处理,完全没有丢包和抖动现象。直播接收程序用rtsp请求服务器的音视频流,...
iOS视频引导app简易demo
视频通话,视频流传输,ios视频通话demo
基于iOS系统定位封装,封装成单例,可直接调用 //获取经纬度回调 typedef void(^LocationToolData)(NSString*longitude,NSString*latitude); @property (nonatomic,copy)LocationToolData longitudeAndLatitude;//...
想学iOS视频编辑相关的技术吗?一手资料,手把手教你如何处理视频编辑。
ios AVPlayer视频播放DEMO
苹果IOS绿标免签封装app,隐藏顶部网址ios14不显示顶部网址跳转设置
开源iOS音视频相机组件,能够帮助开发者快速构造自己的音视频层,支持视频流捕获、视频编码、相片捕获、景深数据捕获
IOS应用源码——录制音频 demo Recording.zip
ios xmpp demo
【IOS苹果免签分发】苹果IOS绿标免签封装app隐藏顶部网址ios14不显示顶部网址跳转设置.zip
IOS 设计模式抽象工厂实例Demo IOS 设计 模式 抽象 工厂
iOS 视频播放Demo源码,网上看到的,供大家一起共同分享学习。
Swift iOS StoreKit 原生内购订阅代码封装,语言是Swift,内含demo,可以二次封装给其他开发工具使用.
arcgis for ios demo 官方例子
MPMoviePlayerController 视频 播放器小demo