说一说IOS使用GCDSocketMenger+硬解码遇到的坑

- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag{

//_readagainTime = [self getTimeNow];

//[h264Decoder decodeNalu:(uint8_t *)[data bytes] withSize:(uint32_t)data.length];

int nRef = 0;

uint8_t *puf = nil;

if(tag == Data){

int type = [self typeOfNalu:data];

if (type == 7 || type == 8 || type == 6 || type == 5) { //SPS PPS SEI IDR

if (type == 7 || type == 8) {

if (h264Decoder) {

nRef = (int)data.length;

puf = (uint8_t *)malloc(data.length);

memcpy(puf,[data bytes],data.length);

const char bytes[] = "\x00\x00\x00\x01";

size_t length = (sizeof bytes) - 1;

NSData *ByteHeader = [NSData dataWithBytes:bytes length:length];

NSMutableData *h264Data = [[NSMutableData alloc] init];

[h264Data appendData:ByteHeader];

[h264Data appendData:[NSData dataWithBytes:puf length:nRef]];

h264Decoder.nalu_type = type;

[h264Decoder decodeNalu:(uint8_t *)[h264Data bytes] withSize:(uint32_t)h264Data.length];

free(puf);

puf = nil;

}

}else{

[keyFrame appendData:lastStartCode];

[keyFrame appendBytes:[data bytes] length:[data length] - [self startCodeLenth:data]];

}

}

if (type == 5 || type == 1  || type == 6) {//IDR P frame

if (type == 5 || type == 6) {

h264Decoder.nalu_type = type;

[h264Decoder decodeNalu:(uint8_t *)[keyFrame bytes] withSize:(uint32_t)keyFrame.length];

keyFrame = [[NSMutableData alloc] init];//reset keyframe

}else{

NSMutableData *nalu = [[NSMutableData alloc]initWithData:lastStartCode];

[nalu appendBytes:[data bytes] length:[data length]-[self startCodeLenth:data]];

char *chBuf = (char*)[nalu bytes];

// NSLog(@"chbuf ======== %x %x %x %x %x %x %x",chBuf[0],chBuf[1],chBuf[2],chBuf[3],chBuf[4],chBuf[5],chBuf[6]);

if (chBuf[0] == 0x00 && chBuf[1]==0x00 && chBuf[2]==0x01) {

nRef = (int)nalu.length-3;

puf = (uint8_t *)malloc(nalu.length-3);

memcpy(puf,[nalu bytes]+3,nalu.length-3);

const char bytes[] = "\x00\x00\x00\x01";

size_t length = (sizeof bytes) - 1;

NSData *ByteHeader = [NSData dataWithBytes:bytes length:length];

NSMutableData *h264Data = [[NSMutableData alloc] init];

[h264Data appendData:ByteHeader];

[h264Data appendData:[NSData dataWithBytes:puf length:nRef]];

h264Decoder.nalu_type = type;

[h264Decoder decodeNalu:(uint8_t *)[h264Data bytes] withSize:(uint32_t)h264Data.length];

}else if (chBuf[0] == 0x00 && chBuf[1]==0x00 && chBuf[2]==0x00 && chBuf[3]==0x01) {

nRef = (int)nalu.length-4;

puf = (uint8_t *)malloc(nalu.length-4);

memcpy(puf,[nalu bytes]+4,nalu.length-4);

const char bytes[] = "\x00\x00\x00\x01";

size_t length = (sizeof bytes) - 1;

NSData *ByteHeader = [NSData dataWithBytes:bytes length:length];

NSMutableData *h264Data = [[NSMutableData alloc] init];

[h264Data appendData:ByteHeader];

[h264Data appendData:[NSData dataWithBytes:puf length:nRef]];

h264Decoder.nalu_type = type;

[h264Decoder decodeNalu:(uint8_t *)[h264Data bytes] withSize:(uint32_t)h264Data.length];

} else{

const char bytes[] = "\x00\x00\x00\x01";

size_t length = (sizeof bytes) - 1;

NSData *ByteHeader = [NSData dataWithBytes:bytes length:length];

NSMutableData *h264Data = [[NSMutableData alloc] init];

[h264Data appendData:ByteHeader];

[h264Data appendData:nalu];

h264Decoder.nalu_type = type;

[h264Decoder decodeNalu:(uint8_t *)[h264Data bytes] withSize:(uint32_t)h264Data.length];

}

//NSLog(@"chBuf %x %x %x %x %x %x %x %x %x %x",chBuf[0],chBuf[1],chBuf[2],chBuf[3],chBuf[4],chBuf[5],chBuf[6],chBuf[7],chBuf[8],chBuf[9]);

}

}else{

//            isGetData = NO;

[socket readDataToData:startcodeData withTimeout:-1 tag:Data];

}

}

if (data.length > [self startCodeLenth:data]) {

[self saveStartCode:data];

}

}

- (int)typeOfNalu:(NSData *)data{

char first = *(char *)[data bytes];

return first & 0x1f;

}

- (int)startCodeLenth:(NSData *)data

{

char temp = *((char *)[data bytes] + [data length] - 4);

return temp == 0x00 ? 4 : 3;

}

- (void)saveStartCode:(NSData *)data

{

int startCodeLen = [self startCodeLenth:data];

NSRange startCodeRange = {[data length] - startCodeLen, startCodeLen};

lastStartCode = [data subdataWithRange:startCodeRange];

}

最主要的是通过socket得到裸码流以后进行转换,在这里卡了好久

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,928评论 6 509
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,748评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,282评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,065评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,101评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,855评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,521评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,414评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,931评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,053评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,191评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,873评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,529评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,074评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,188评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,491评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,173评论 2 357

推荐阅读更多精彩内容

  • 对于视频文件和rtsp之类的主流视频传输协议,ffmpeg提供avformat_open_input接口,直接将文...
    我在鄱阳湖边阅读 3,492评论 6 10
  • /**ios常见的几种加密方法: 普通的加密方法是讲密码进行加密后保存到用户偏好设置( [NSUserDefaul...
    彬至睢阳阅读 2,935评论 0 7
  • 转自:http://www.code4app.com/blog-866962-1317.html1、设置UILab...
    MMOTE阅读 1,622评论 1 1
  • 20170830 心赏第16天 亲爱的康夫君,我说我没油了你二话不说立马去加,我一个十几年驾龄的老司机好像除了会开...
    静夜思CJ阅读 244评论 0 1
  • 一、上午我去池阳小学听了一节课和一场讲座,触动了我了。那节课让我真正的感受到一题多变,体现杨老师教学技艺精湛!那讲...