00:00
我就调用对不对。你看啊,我就调用,但这个时候你会发现,诶,我捕获到的内容,捕获到内容的时候,我判断一下当前这个内容是音频还是视频,如果是音频,我就要调取我的音频编码器来进行编码,对不对,如果是视频,我就要调取视频编码器来进行编码,所以注意了。这个视频编码器都是干嘛,一边采集一边编码,明白了没有,明白了扣个六啊,一边采集一边编码,所以这个过程对不对,这个过程中我们是同时进行的啊,同时进行的好,那这时候呢,我来看一下这个视频编码器,对吧?视频编码器。大家注意看这个视频编码器呢啊,首先大家可能会觉得对吧,在音视频这个赛道上面对吧,IOS或者说啊,视觉这一块,IOS这个赛道上面还是比较薄弱的,首先呢,因为iOS进入中国还是比较年轻的啊,这个大家必须要认可,对不对,在中国这个赛道上面还是比较年轻的,而且呢,我们中国的iOS开发者也比较年轻,所以说在这上面要有积累和积淀,是需要时间啊,需要时间的,对不对,大家能理解吧,能理解扣个六啊,就是大家需要这个东西。
01:08
的研发也好,或者说更新也好,不是一个人的力量,是需要在座的同学也需要去做对吧,也需要去做的,对不对哈,所以说大家要一起努力啊,一起努力,我也希望中国的技术对吧?啊也可以啊,更更博大精深,但是这是一个过程的事情,对吧,我没必要在这方面care啊好,然后呢,我们来看一下,这时候呢,当我捕获到数据之后啊,当我捕获到数据之后,我就干嘛呢,我就进入到了我这个。注意看这里面呢,有两个方法,第一个方法呢,是我的这个队列啊,看我的session的配置,注意了这个session的配置呢,在我们今天的资料里面,我也给大家看一下啊。啊,注意了啊,不是我懒,是我如果通过直播课的讲解你根本记不住,所以说我就给大家总结资料啊,大家看,首先呢,我调用这个comp的create方法来创建一个session,在这里面呢,有很多很多的参数配置,看到没有第123456,这个时候注意了,很多参数都是添加默认参数,所以大家按照这个去填就可以了。
02:08
啊,按照这个去填就可以了,根本就不需要记对不对啊,根本就不需要记明白了没有,明白了扣个六啊。然后呢,这个时候第二步干嘛呢?第二步我们就开始设置它的相关参数啊,设置它的相关参数,比如说它的码率呀,它的这样的一个关键帧的间隔呀,包括FPS,那什么时候开始编码的,当我从这个如controlr里面对吧,获取到数据之后,我就干嘛,我就开始进行编码了啊,我就开始进行编码了,那开始进行编码的话,第一件事情干什么,首先拿到我的真实数据,然后呢,调用我的编码方法,注意了此时此刻。不管是用fmpad也好,还是V托也好,你是不需要写算法的。所以说对应是没有想象那么难,你不需要写算法,你只需要干嘛,你只需要调用出它合理的方法就可以了,比如说在visit bus,我是这个方法,在ipad里面就是另外的对应的指令,明白了没有,明白了扣个六啊,所以我不是说I packd我们不去学,只是说干嘛,只是说我们选择性的对吧,我们去学V,然后再学一份PA是不是?所以这个地方是不冲突的啊,同学们啊,如果说你只啊搞S份pad,你会发现在原生开发里面有很多依赖,对吧?比如说我们之前做的项目,其实对原生的依赖度也很高啊,带原生的依赖度也很高,明白了没有,好,然后这个时候注意看。
03:28
就是通过这么一个方法,我们就完成了它的编码啊,完成了它的编码,所以说很看起来很简单啊,只是看起来很简单,因为你看到的是答案嘛,对不对,好,那这个时候拿到这个数据之后。拿到这个数据之后,注意了,这个编码是硬编码,是硬编码,不是CPU去完成这个编码动作啊,而且呢,它是串行的啊,并不是并发的啊好,然后呢,这个时候在这里面我们什么时候采集到数据呢?注意了,在这个回调方法里面,这个回调方法在哪呢?在我们设置这个C的时候,就有一个回调方法。
04:00
这个回调方法的意义是什么?当我采集到数据之后,就会来到他的回调方法啊,就会来到他回调方法,这样的回调方法是一个比较重要的细节,很多开发者可能会在这上面犯一些错啊,犯一些错导致呢,我们有时候遇到坑了就会有畏难心理啊,就是在这就放弃了,所以说大家不要在这儿放弃啊,注意了。注意看,首先四老师列举了几条关键的一个概念啊,第一个在一在H64文件里面,我们都有一个头,叫SPS和PPS,所以在这里面注意看我们的HL64文件,它都是有两个头的,SPS和PPS,这个不是在iOS上面才有这样的一个。啊,一个这样的需求的,不管你是安卓也好,还是iOS也好,还是黑莓手机也好,还是Windows平台也好,通通都需要对什么对我们的HR64干嘛进行我们的什么进行我们的这样的一个头的接入,明白了没有,明白了扣个六其次不管你用任何框架啊,任何框架你都需要去遵循这个原则啊遵循这个原则,那为什么呢。
05:07
因为我们的HR64,我们的视频文件都是要干嘛,都是要保证全平台播放的,对不对,全平台播放的,所以说这个时候我们怎么去拿到SBS和PPS呢?首先在我们的视频帧里面只有一个东西是完整的,那就是关键帧对不对?所以说我们要从判断一下当前的帧是不是关键帧,其次他有没有拿到过SPS和SPPS,他只需要拿一次就可以了,放在文件头,所以这时候我们判断一下,如果他没有拿过当前的真用是关键证的话,我们通过调取这两个方法,通过调取这两个方法,这两个方法在哪里有呢?在我的文档里面有,所以我不会特别细的去讲,他的名字你也记不住,对不?我讲了半天,好,通过这两个方法去获得SPS和PPS。那获了之后呢,你会发现它是一个什么,它是一个类似于指针的东西,对不对,那是于指针的东西,所以说我们要把它转成什么,转化成UN as beautiful date,注意了没有听到没有听到,扣个六啊,就把它从一个指针啊加地址的东西转化成一个数据,好注意看第二个规则。
06:12
第二规则呢,是什么,我们的和PPS。就我们的流数据之间都有一个间隔符。这个间隔符是什么?16进制的00000001 OK,也就是说这个间隔符是需要什么?在座同学们手动插入。手动。这个。对不对,又需要我们手动,所以说大家注意看,在这个过程中,四老师创建了一个啊,00000001的这样的一个start code,然后呢,在我们七啊,在我们把它转换成ns MU date的时候,我们首先给它拼接了一个code,在拼接了我们的SPS date,看到没有看到扣个六啊好注意了,这个时候拿到SPS和PPS之后,我们怎么办?回到我们的代理方法,注意看啊。
07:07
回到我们代理方法,回到代理方法之后呢,我们干嘛写入文件,也就是说这个时候我创建了一个文件,我把它write file里面去把它写进去,写进去之后在这个文件里面就有它的文件头SPS和PPS了,注意了,这个SPS和PPS是我们在解码的时候必须要获取的,否则的话你就没有办法进行解码啊,否则的话你就没有办法进行解码,好,这个只是它的头,对吧,我们还有很多流数据,怎么办呢?再一次回到我们的这个。代码里面来。好,注意看这是第二步了啊,剩下呢,我们在这个cm block buffer里面呢,有很多我们的视频真数据对不对,我们编码后的数据,那我就需要干嘛把它读取出来,然后干嘛写入文件对不对,那我们在C语言里面有两种方式读取文件,第一个移动指针,第二个移动偏移量对不对?所以说只要我的什么,只要我的偏移量小于我的这个文件的总长度,我是不是就还没有读取完。
08:04
是不是是不扣个六啊,比如说我先读两个我的文件总长度是十,我读好我现在当前是二,就表示我没有读完,所以一直到什么,一直到我的offset要大于或者等于我的总长度的时候,我才表示这个数据对我读取完了,这个动作是一直反复重复的,因为你是一边采集一边读取,一边采集一边编码一边写入,对不对,是一个啊,一系列啊,就一个比较流线的过程,好那这时候怎么办?注意看第二个知识要点来了。因为iOS平台上面是系统端是小端,但是我们做音视频的时候是大端听清楚啊,音视频是大端,IOS是小端,所以这个时候我们就要干嘛保持同一个啊读取方式对不对,所以说我们要干嘛拿到我们的数据,然后呢,把它从大端转化成小端,就这两行代码啊转成下嘛,好,这一块也可以做一下,边下边播啊是没有问题的,对吧?你边下边播的话怎么办?你就需要解码呀,这个齐麟乐乐同学对吧?你需要解码呀,对吧,你你。
09:01
你读取到了,你当然要解码,不然你怎么办对吧,直接渲染,直接渲染了,这个时候跟编码解码也没有关系了,对不对?好注意看在这里面我就拿到了我的流数据,对吧?拿到流数据拿流失之后呢,毁掉,继续写入到文件里面去。对,技术写入到文件区里面对不对。对不对,写入到文件去之后怎么办,直到什么,直到你的编码结束,也就当我从这个c system capture里面,我调取了哪个方法,我就结束呢,我调取这个stop。看到没有,我什么时候停止录制,我什么时候就结束编码,明白了没有,明白了扣个六好,那我刚刚讲的可能大家没有办法说我讲一节课对吧,一个多小时你就马上搞会,OK,这是需要时间的,这是需要时间的,同学们,音视频这个东西真的是。很磨人耐性的,就是徐老师也是踩过很多坑,在工作中解决了很多很多,就是我也需要四五天一个礼拜才能搞定一个bug,那种日子也很多。所以大家。
我来说两句