谈一谈做iOS播放器库开发所涉及的知识点
在自己研究生毕业的时候,想着能找上一份做视频编解码的工作,可惜没有如愿,最后到了一家iOS游戏渠道公司去做游戏支付业务的SDK开发,我的iOS正式开发生涯就这么开始了。
在那家iOS游戏渠道没做上一年,就离职了,至于怎么离职的,后续文章会谈一谈,以此来梳理下自己的职业规划。说了这多了,进入正题吧,今年3月份找上了一家做音视频服务的公司,做iOS播放器的开发,职位是播放器开发工程师,就是我现在所在的公司咯。
要开发一套属于自己的播放器库,不利用移动设备上自带的播放器来播放音频、视频,要用到哪些知识点呢,下面以我熟悉公司播放器库的前提下,说一说我的看法。
任何客户端只要跟服务器打交道,少不了通讯协议。音视频这块涉及的实时流相关协议很多,有RTSP、RTMP、MMS、HLS、RTP、RTCP、SDP、TCP、UDP、HTTP等。
客户端从服务器上获取到的音视频数据,要知道容器与编码方式的区别,封装音视频数据的容器类型主要有AVI (*.avi)、MPG (*.mpg/*.mpeg/*.dat)、VOB (*.vob)、MP4、3GP、ASF (*.wmv/*.asf) 、RM (*.rm/*.rmvb)、MOV (*.mov)、MKV 、WAV、TS。
客户端从服务器上获取到了音视频数据,该如何进行解码显示,首先要知道音频、视频的的编码方式,客户端要显示音视频数据需要根据编码的方式进行相应的解码操作,目前常见的编码类型有MPEG系列、H.26X系列、微软windows media系列、Real Media系列、QuickTime系列。
上面说到了一些流媒体协议、流媒体数据的封装类型以及编码方式。而我们要做一款播放器首先是要对以上知识要了解的。
公司的业务涉及最多的是rtsp这块。服务器端为rtsp流媒体服务器,客户端也就是播放器库采用FFMpeg进行解码、OPenGL ES进行YUV视频数据渲染。
播放器库与服务器端进行交互,涉及到RTSP协议的请求,传输层协议采用的TCP、UDP协议,所以要对TCP连接的三次握手要熟悉,这其中也就涉及到网络编程中的SOCKET编程知识了,BSD socket编程是需要掌握的。
播放器库对从服务器上请求到的音频、视频rtp包,要进行解包,就是去掉一些协议的头获取到音视频数据段。获取到这些数据后,不能直接播放,需要进行解码操作。视频解码出来一般为Planar 4:2:0 YUV格式。要显示YUV视频图像就需要利用OPenGL ES进行渲染了。
播放器在工作时,视频数据要进行解码放入数据缓存区,数据缓存区的解码后的数据被取出交给OpenGL进行渲染,所以多线程是必不可少的环节了。开辟2个线程,一个线程进行解码处理,另一个线程进行视频数据的渲染。多线程中常使用的是POSIX thread多线程编程。
虽然开发的iOS播放器库,但是底层的东西大部分是c语言的东西,比如用到开源库FFMpeg,以及一些上层的对FFMpeg的封装,数据缓存区,所以c语言和数据结构的基础要扎实,什么函数指针,内存分配与管理,数据结构中的单链表那得玩得比较溜。
总结一下,需要具备的知识有
rtsp、sdp、tcp、udp、ip协议(rtsp的DESCRIBE、OPTION、SETUP、PLAY、PAUSE、TEARDOWN;tcp连接的三次握手/断开的四次握手)
socket(bsd socket)
多线程(posix thread)
opengl es
FFMpeg(知道用它来解码)
YUV420(知道它的原理与格式)
音视频同步(时间戳的处理)
c语言指针(void *、函数指针、回调函数)
内存管理(堆区、栈区、静态区、内存对齐)
数据结构(单链表)
谈一谈做iOS播放器库开发所涉及的知识点的更多相关文章
- iOS播放器 - AVPlayer
之前有说到在播放器中一点点小技巧,现在正式记录一下AVPlayer. 这里主要是说明用AVPlayer做音乐播放器的功能实现,所以不介绍AVPlayer中那个图层类. 首先我们要声明一下播放器,这里有 ...
- C#做音乐播放器时在自动下一曲中报异常的解决办法
---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ---------------------- 在利用Media Player做音乐播放器的时 ...
- 使用 electron 做个播放器
使用 electron 做个播放器 本文同步更新在:https://github.com/whxaxes/blog/issues/8 前言 虽然 electron 已经出来好长时间了,但是最近才玩了一 ...
- Android音乐播放器的开发实例
本文将引导大家做一个音乐播放器,在做这个Android开发实例的过程中,能够帮助大家进一步熟悉和掌握学过的ListView和其他一些组件.为了有更好的学习效果,其中很多功能我们手动实现,例如音乐播放的 ...
- 笔谈kxmovie开源播放器库的使用
开源播放器项目 kxmovie(https://github.com/kolyvan/kxmovie),现在仍然是很多刚开始接触播放器开发的程序员的参照范本.以下是我操作kxmovie项目的过程: ( ...
- iOS播放器 - AVAudioPlayer
今天记录一下AVAudioPlayer,这个播放器类苹果提供了一些代理方法,主要用来播放本地音频. 其实也可以用来播放网络音频,只不过是将整个网络文件下载下来而已,在实际开发中会比较耗费流量不做推荐. ...
- 自定义css样式结合js控制audio做音乐播放器
最近工作需求需要播放预览一些音乐资源,所以自己写了个控制audio的音乐播放器. 实现的原理主要是通过js调整audio的对象属性及对象方法来进行控制: 1.通过play().pause()来控制音乐 ...
- 用mciSendString做音乐播放器
音乐操作类 public class clsMCI { public clsMCI() { // // TODO: 在此处添加构造函数逻辑 // } //定义API函数使用的字符串变量 [Marsha ...
- iOS播放器、Flutter高仿书旗小说、卡片动画、二维码扫码、菜单弹窗效果等源码
iOS精选源码 全网最详细购物车强势来袭 一款优雅易用的微型菜单弹窗(类似QQ和微信右上角弹窗) swift, UITableView的动态拖动重排CCPCellDragger 高仿书旗小说 Flut ...
随机推荐
- 秒杀功能压测 jmeter----------windows系统运行jmeter遇到的坑
最近做了一个安全传输模块,因为怕对性能有较大影响,因此测试安排了针对性的压测 压测的过程出现了一点小问题 发现失败率特别高,测试怀疑是服务端出了错,但是我查看日志发现没有报错.后面我观察TCP链接数排 ...
- 缓存:修改Hosts不生效
修改Hosts为何不生效,是DNS缓存? - Barret李靖 - 博客园https://www.cnblogs.com/hustskyking/p/hosts-modify.html 换个未打开过的 ...
- mysql Last_SQL_Errno: 1197 Coordinator stopped because there were error(s) in the worker(s)问题处理
Last_SQL_Errno: 1197 Coordinator stopped because there were error(s) in the worker(s). The most rece ...
- 品优购商城项目(五)消息中间件 ActiveMQ
消息中间件用于降低各个项目模块的耦合,适用于不需要等待返回消息才能进入下一个业务环节的模块,以及实时要求性不高的业务模块. 一.JMS JMS(Java Messaging Service)是Java ...
- Laya自定义组件
laya2.1.1.1 参考: 预设使用 一 没有自定义组件 教程翻了几遍,没有自定义组件,论坛搜了下,说是不能使用. 二 预置件做自定义组件 预置件无法右键创建. 又去翻教程.终于知道预置件怎么创建 ...
- 转 全新多媒体共享器Ipush推送|Miracast WIFI无线同屏推送
http://www.52bjw.cn/product-info/5767857.html 操作指南及注意事项 (draft) miracast和dlna/airplay分别工作在wifi direc ...
- linux查找文件利器
查找文件 比如:找nginx.conf配置文件 locate nginx.conf /usr/local/etc/nginx/nginx.conf /usr/local/etc/nginx/nginx ...
- 【视频开发】【计算机视觉】doppia编译之一:前言及安装CUDA
最近做一个"高清视频人流量检测"的项目,由于对实时性要求较高,我们需要较快的检测速度.在搜索茫茫"论"海后,我在"The Fastest Deform ...
- java的Array和List相互转换
1.Array转List,通过java.util.Arrays.asList(T... a)参数是可变泛型参数 注意,Arrays.asList返回的类型是不可变长度的集合,底层是final修饰的泛型 ...
- 六、spring之通过FactoryBean为ioc容器中添加组件
前面我们已经介绍了几种为容器中添加组件的方法,今天一起学习通过FactoryBean添加组件的方法. 首先我们准备一个类,也就是我们需要注册进spring的ioc容器中的类 类Color: // 不必 ...