ffmpeg和流媒体视频编解码的研究

常见视频格式的一些特点和区别 * mkv、rmvb、avi、MP4、flv、wmv这些指的都是文件格式,也就是封装格式,都是容器,而不是真正的数据压缩格式,内部封装都是采用不同的音视频编码压缩后的数据,比如mp4,flv内部都是h264格式的视频数据和aac的音频数据 * 1、mkv:mkv不等同于音频或视频编码格式,它只是为这些进行过音视频编码的数据提供了一个封装的格式,简单的说就是指定音视频数据在文件中如何排列放置。 MKV最大的特点就是能容纳多种不同类型编码的视频、音频及字幕流,俗称万能媒体容器。 MKV加入AVI所没有的EDC错误检测代码,这意味着即使是没有下载完毕的MKV文件也可以顺利回放,这些对AVI来说完全是不可想象的。虽然MKV加入了错误检测代码,但由于采用了新的更高效的组织结构,用MKV封装后的电影还是比AVI源文件要小了约1%,这就是说即使加上了多个字幕,MKV文件的体积也不可能比AVI文件大。 MKV支持可变帧率,它可在动态画面中使用较大的帧率,而在静态画面中使用较小的帧率,这样可以有效的减少视频文件的体积,并改善…

iOS架构设计与优化(三)

之前介绍了在项目层面如何去进行数据解耦和服务中间件的实现,这篇主要介绍在MVC模块内部如何不用MVVM而达到MVVM解耦的效果 我们都知道,MVVM设计模式是在MVC使用过程中日益庞大而不易维护的背景下应运而生的,设计思想和目的都是为C减负,将C中的业务和一些能抽出的逻辑代码抽出到VM中处理,使整体项目结构达到低耦合、高内聚 废话不多说,还是用一个实例来对比说明 页面为一个常规列表页,列表中展示的为订单信息,cell样式根据订单状态可能有两种样式,一种需要付款的状态cell样式,另一种不需要付款的状态cell样式,两种样式的cell高度不同 一种MVVM的实现 // Model struct OrderSummaryModel { var orderNumber: String? var orderState: Int? var orderDescirption: String? var orderAmount: String? var orderCreateDate: String? var orderNeedPay…

Swift中的权限控制

Objective-C 拥有 4 个访问控制相关的修饰符 @public @protected @private 和 @package,他们只能用来修饰成员变量。@public 修饰的成员变量可以任何地方进行访问,@protected 修饰的成员变量可以当前类及其子类中访问,@private 修饰的成员变量只可以在当前类访问。@package 修饰的成员变量在当前 Framework 中访问。成员变量的默认修饰符为 @protected。 但是对于动态语言来说,访问控制并没有真正的意义,就算是 @private 的成员变量你仍然有无数种方式来访问他们。所以在 Objective-C 中访问控制本质上只是用来隐藏实现细节,告诉使用者哪些才是真正需要关心的,并为不需要关心部分的直接调用创造一些麻烦。 在 Objective-C 中这些访问控制的修饰符很少被使用,因为 Objective-C 有很多更好的隐藏细节的方式。一般情况下,我们使用 @property 隐藏成员变量来实现读写权限控制。需要 @public 权限时,我们只需要将 @property 定义在 .h 文件中。…

iOS架构设计与优化(一)

前言 随着移动开发的浪潮逐渐退去,现在对于移动开发工程师的要求越来越高,不在仅仅满足于能完成项目所需的功能于界面的搭建,对于底层和架构的理解对于现在的开发越来越重要,在此有一点架构的设计经验可以与大家分享和探讨 传统移动MVC设计模式 在长久以来的开发过程中,我们有使用着用途最广,使用者众多的MVC设计模式。但是,随着开发的进行,MVC产生的问题越来越多,控制器层的代码无法控制,代码越来越难以维护和迭代。每当产品来提出新的需求,程序猴子们的大刀早已饥渴难耐了,但是又不得不陷入继续打补丁版本更新无尽的循环中··· 是MVC已经被时代淘汰了吗? 可能我们没有使用正确的姿势 深入理解MVC中的M Model不只是一个数据模型,更是一个处理数据产生、获取、逻辑处理中心,不能只单单理解为一个数据模型,我们在开发中使用的Model只是这个数据中心中很小很小的一个部分。而在这个数据中心中,我们又应该将这个中心分层,比如可以分为Service层用来处理业务逻辑、DAO层处理数据库逻辑、Protocol层来封装一些某些功能接口等等。在此,我使用JAVAWeb中的一个图来描述…

iOS模块化开发研究

看了 Limboy 和 Casa 对 iOS 组件化方案的讨论,写篇文章梳理下思路。 首先我觉得”组件”在这里不太合适,因为按我理解组件是指比较小的功能块,这些组件不需要多少组件间通信,没什么依赖,也就不需要做什么其他处理,面向对象就能搞定。而这里提到的是较大粒度的业务功能,我们习惯称为”模块”。为了方便表述,下面模块和组件代表同一个意思,都是指较大粒度的业务模块。 一个 APP 有多个模块,模块之间会通信,互相调用,例如微信读书有 书籍详情 想法列表 阅读器 发现卡片 等等模块,这些模块会互相调用,例如 书籍详情要调起阅读器和想法列表,阅读器要调起想法列表和书籍详情,等等,一般我们是怎样调用呢,以阅读器为例,会这样写: #import "WRBookDetailViewController.h" #import "WRReviewViewController.h&…

JS与OC互调

最近在看React-native相关东西,发现rn中使用的javascriptcore这个框架来完成oc和js交互,故先了解一些相关东西,为后续研究准备 * JavaScriptCore作用:JavaScriptCore是苹果原生API,用来JS和OC交互的,库中有三个重要的类如下 * JSContext: JS运行环境,用它去执行JS代码,并且通过它去获取JS里的数据 * JSValue: 用于接收JS中获取的数据类型,可以是任一对象,方法 JS调用原生OC篇 方式一 * 第一种方式是用JS发起一个假的URL请求,然后利用UIWebView的代理方法拦截这次请求,然后再做相应的处理。 * 我写了一个简单的HTML网页和一个btn点击事件用来与原生OC交互,HTML代码如下: <html> <header> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <script type="text/javascript"…

ijkplayer

导入准备(省去茫茫多的打包集成步骤): * 参考资料:http://www.jianshu.com/p/1f06b27b3ac0 1.ijkplayer用法简介 * 只需要有推流url地址即可 * 注:最好真机测试,模拟器卡、不流畅 2.抓取数据 * 抓取了映客直播数据,没加密 * 映客主播接口url:http://116.211.167.106/api/live/aggregation?uid=133825214&interest=1 - (void)loadData { // 映客数据url NSString *urlStr = @"http://116.211.167.106/api/live/aggregation?uid=…

ReactiveCocoa-2

1.ReactiveCocoa常见操作方法介绍。 * 1.1 ReactiveCocoa操作须知 * 所有的信号(RACSignal)都可以进行操作处理,因为所有操作方法都定义在RACStream.h中,而RACSignal继承RACStream。 * 1.2 ReactiveCocoa操作思想 * 运用的是Hook(钩子)思想,Hook是一种用于改变API(应用程序编程接口:方法)执行结果的技术. * Hook用处:截获API调用的技术。 * Hook原理:在每次调用一个API返回结果之前,先执行你自己的方法,改变结果的输出。 * RAC开发方式:RAC中核心开发方式,也是绑定,之前的开发方式是赋值,而用RAC开发,应该把重心放在绑定,也就是可以在创建一个对象的时候,就绑定好以后想要做的事情,而不是等赋值之后在去做事情。 * 列如:把数据展示到控件上,之前都是重写控件的setModel方法,用RAC就可以在一开始创建控件的时候,就绑定好数据。…