自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(98)
  • 资源 (2)
  • 收藏
  • 关注

原创 基于sqlite数据库

#IOS中的SQLite3的封装与详细应用SQLite是一个开源的嵌入式关系数据库,特点是易使用、高效、安全可靠、可移植性强。##IOS中的本地持久化存储**NSUserDefault**:一般用于存储小规模数据、业务逻辑弱的数据。**keychain**: 苹果提供的可逆存储,因为有着只要app不重装系统、可以同步i

2017-05-05 16:24:23 931

原创 iOS自动化部署

工具介绍iOS可持续化集成: Jenkins+bundler+cocoapods+fastlane

2017-03-19 20:54:43 2540

原创 RACSignal的变换操作的底层实现(3)

前言继续分析RACSignal的变换操作的底层实现。目录1.高阶信号操作2.同步操作3.副作用操作4.多线程操作5.其他操作一. 高阶信号操作高阶操作大部分的操作是针对高阶信号的,也就是说信号里面发送的值还是一个信号或者是一个高阶信号。可以类比数组,这里就是多维数组,数组里面还是套的数组。1. flattenMap: (在父类RACStream中定义的)

2016-12-12 15:59:00 2113

原创 RACSignal 冷信号和热信号底层实现分析

前言由于最近在写关于RACSignal底层实现分析的文章,当然也逃不了关于冷热信号操作的分析。这篇文章打算分析分析如何从冷信号转成热信号的底层实现。目录1.关于冷信号和热信号的概念2.RACSignal热信号3.RACSignal冷信号4.冷信号是如何转换成热信号的一. 关于冷信号和热信号的概念冷热信号的概念是源自于源于.NET框架Reactive Extens

2016-12-09 11:42:34 5104 1

原创 自动化 Code Review

为了保证代码质量,Code Review 是非常重要的一环。细到*的位置是否正确,大到代码的结构是否符合了软件开发的一些基本原则,都在这项工作的范围内。受限于现实情况,大多数团队没有足够的时间进行 Code Review,那么只能把一部分 CR 工作交给计算机去完成了。我们只需要定下合理的流程,用代码告诉计算机需要做什么,剩下的就交给我们可靠的伙伴吧。应用了自动化 Code Rev

2016-12-08 12:03:59 3368

原创 iOS 持续集成系列

iOS 开发在经过这几年的野蛮生长之后,慢慢地趋于稳定。无论开发语言是 Objective-C 还是 Swift,工程类型是 Hybird 还是原生,开发思想是 OOP 还是函数式,随着项目逐渐变大都在面临相同的问题: 测试、发布等重复性工作占了很大一部分时间,回归成本越来越高。持续集成不可避免地被提上了日程。本文主要阐述 iOS 下的持续集成,以目标、内容、流程、工具入手,希望可以为大家

2016-12-08 11:38:37 743

原创 RACSignal 所有变换操作底层实现分析(2)

前言继续分析RACSignal的变换操作的底层实现。目录1.过滤操作2.组合操作一. 过滤操作过滤操作也属于一种变换,根据过滤条件,过滤出符合条件的值。变换出来的新的信号是原信号的一个子集。1. filter: (在父类RACStream中定义的)这个filter:操作在any:的实现中用到过了。- (instancetype)filter:(BOO

2016-12-05 17:20:40 948

原创 RACSignal 所有变换操作底层实现分析(1)

之前详细分析了RACSignal是创建和订阅的详细过程。看到底层源码实现后,就能发现,ReactiveCocoa这个FRP的库,实现响应式(RP)是用Block闭包来实现的,而并不是用KVC / KVO实现的。在ReactiveCocoa整个库中,RACSignal占据着比较重要的位置,而RACSignal的变换操作更是整个RACStream流操作核心之一。在上篇文章中也详细分析了bind操作

2016-12-05 16:11:05 1317

原创 深入研究Block捕获外部变量和__block实现原理

前言Blocks是C语言的扩充功能,而Apple 在OS X Snow Leopard 和 iOS 4中引入了这个新功能“Blocks”。从那开始,Block就出现在iOS和Mac系统各个API中,并被大家广泛使用。一句话来形容Blocks,带有自动变量(局部变量)的匿名函数。Block在OC中的实现如下:struct Block_layout { void *isa;

2016-12-05 11:56:30 2191

原创 持续化集成工具Jenkins

众所周知,现在App的竞争已经到了用户体验为王,质量为上的白热化阶段。用户们都是很挑剔的。如果一个公司的推广团队好不容易砸了重金推广了一个APP,好不容易有了一些用户,由于一次线上的bug导致一批的用户在使用中纷纷出现闪退bug,轻则,很可能前期推广砸的钱都白费了,重则,口碑不好,未来也提升不起用户量来了。静下心来分析一下问题的原因,无外乎就是质量没有过关就上线了。除去主观的一些因素,很大部分的客

2016-12-05 10:54:23 3889

原创 HTTP与HTTPS区别

HTTPS关于2017年AppStore新提交应用必须打开ATS的要求只剩下一个多月了,相信大部分开发者都已经完成了从http到https的升级。当然了,现在谁也不知道如果依旧关闭ATS,审核的时候会发生什么。挑战apple的事,还是不要做比较好…最近看完了《HTTPS图解》,借花献佛,简要分享下相关知识点。HTTP与HTTPS区别HTTPS的URL以https开头

2016-11-30 16:56:29 758

原创 iOS 10 UserNotifications 框架解析

iOS 10 中以前杂乱的和通知相关的 API 都被统一了,现在开发者可以使用独立的 UserNotifications.framework 来集中管理和使用 iOS 系统中通知的功能。在此基础上,Apple 还增加了撤回单条通知,更新已展示通知,中途修改通知内容,在通知中展示图片视频,自定义通知 UI 等一系列新功能,非常强大。对于开发者来说,相较于之前版本,iOS 10 提供了一套非常

2016-11-21 14:36:12 1222

原创 ReactiveCocoa中潜在的内存泄漏及解决方案

ReactiveCocoa是GitHub开源的一个函数响应式编程框架,目前在美团App中大量使用。用过它的人都知道很好用,也确实为我们的生活带来了很多便利,特别是跟MVVM模式结合使用,更是如鱼得水。不过刚开始使用的时候,可能容易疏忽掉一些隐藏的细节,从而导致内存泄漏等问题。本文就带大家深入了解下ReactiveCocoa中隐藏的一些细节,帮助大家以更加正确的姿势使用ReactiveCocoa。

2016-11-15 15:01:35 3904

原创 ReactiveCocoa核心元素与信号流

ReactiveCocoa(以下简称“RAC”)是一个函数响应式编程框架,它能让我们脱离Cocoa API的束缚,给我们提供另外一套编码的思路与可能性,它能在宏观层面上提升代码易读性与稳定性,让程序员写出富有“诗意”的代码,因此倍受业内推崇。本文略过RAC基本概念与基础使用(有些技术点可以参考美团点评技术博客之前的几篇文章:RACSignal,冷信号与热信号系列,内存泄漏。),着重介绍RAC数据流

2016-11-09 22:10:29 1058

原创 iOS开发系列--App扩展开发

从iOS 8 开始Apple引入了扩展(Extension)用于增强系统应用服务和应用之间的交互。它的出现让自定义键盘、系统分享集成等这些依靠系统服务的开发变成了可能。WWDC 2016上众多更新也都是围绕扩展这一主题来进行了的,例如开发的Siri、iMessage Apps其实都是依靠扩展来工作的。在最新的Xcode 8 beta中也增加了众多的Extension 模板帮助开发者更快的实现不同类

2016-11-04 14:08:13 1132

转载 基于FFMPEG的封装格式转换器

简介本文介绍一个基于FFMPEG的封装格式转换器。所谓的封装格式转换,就是在AVI,FLV,MKV,MP4这些格式之间转换(对应.avi,.flv,.mkv,.mp4文件)。需要注意的是,本程序并不进行视音频的编码和解码工作。而是直接将视音频压缩码流从一种封装格式文件中获取出来然后打包成另外一种封装格式的文件。传统的转码程序工作原理如下图所示:上图例举了一个举例:FLV(视

2016-10-14 15:38:44 4579 13

原创 AOP编程

1. AOP简介AOP: Aspect Oriented Programming 面向切面编程。  面向切面编程(也叫面向方面):Aspect Oriented Programming(AOP),是目前软件开发中的一个热点。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。  AOP是OOP的延续,是(Aspe

2016-10-13 13:49:18 806

原创 组件化架构剖析

组件化架构的由来随着移动互联网的不断发展,很多程序代码量和业务越来越多,现有架构已经不适合公司业务的发展速度了,很多都面临着重构的问题。在公司项目开发中,如果项目比较小,普通的单工程+MVC架构就可以满足大多数需求了。但是像淘宝、蘑菇街、微信这样的大型项目,原有的单工程架构就不足以满足架构需求了。就拿淘宝来说,淘宝在13年开启的“All in 无线”战略中,就将阿里系大多数

2016-10-10 18:03:55 9638 1

转载 YUV编码为HEVC(H.265)

流程下面附上一张FFmpeg编码视频的流程图。通过该流程,不仅可以编码H.264/H.265的码流,而且可以编码MPEG4/MPEG2/VP9/VP8等多种码流。实际上使用FFmpeg编码视频的方式都是一样的。图中蓝色背景的函数是实际输出数据的函数。浅绿色的函数是视频编码的函数。简单介绍一下流程中各个函数的意义av_register_all():注册FFmpeg所有编解码器

2016-10-09 18:40:52 4520

原创 YUV420P的像素数据编码为H.264的压缩编码数据

本文介绍一个最简单的基于FFMPEG的视频编码器。该编码器实现了YUV420P的像素数据编码为H.264的压缩编码数据。编码器代码十分简单,但是每一行代码都很重要,适合好好研究一下。弄清楚了本代码也就基本弄清楚了FFMPEG的编码流程。下面附一张使用FFmpeg编码视频的流程图。使用该流程,不仅可以编码H.264的视频,而且可以编码MPEG4/MPEG2/VP8等等各种FFmp

2016-10-09 18:20:03 3835

转载 PCM音频采样数据编码为AAC的压缩编码数据

本文介绍一个最简单的基于FFMPEG的音频编码器。该编码器实现了PCM音频采样数据编码为AAC的压缩编码数据。编码器代码十分简单,但是每一行代码都很重要。通过看本编码器的源代码,可以了解FFMPEG音频编码的流程。下面附一张使用FFmpeg编码音频的流程图。使用该流程,不仅可以编码AAC的音频,而且可以编码MP3,MP2等等各种FFmpeg支持的音频。图中蓝色背景的函数是实际输

2016-10-09 17:43:12 7703 11

转载 YUV420P像素数据编码为JPEG图片

本文的编码器实现了YUV420P的数据编码为JPEG图片。本着简单的原则,代码基本上精简到了极限。使用了2014年5月6号编译的最新的FFMPEG类库。程序很简单,打开工程后直接运行即可将YUV数据编码为JPEG。本程序十分灵活,可以根据需要修改成编码各种图像格式的编码器,比如PNG,GIF等等。平台使用VC2010。 * 本程序实现了YUV420P像素数据编码为JPEG图

2016-10-09 16:43:17 4480 14

原创 AVPacket

在此不再详述,其中AVPacket是存储压缩编码数据相关信息的结构体。本文将会详细分析一下该结构体里重要变量的含义和作用。typedef struct AVPacket {      /**      * Presentation timestamp in AVStream->time_base units; the time at which      * the d

2016-10-09 14:55:26 1354

原创 AVIOContext

在此不再详述,其中AVIOContext是FFMPEG管理输入输出数据的结构体。本文将会详细分析一下该结构体里每个变量的含义和作用。* Bytestream IO Context.  * New fields can be added to the end with minor version bumps.  * Removal, reordering and change

2016-10-09 14:40:52 536

原创 FLV封装格式解析

原理FLV封装格式是由一个FLV Header文件头和一个一个的Tag组成的。Tag中包含了音频数据以及视频数据。FLV的结构如下图所示。有关FLV的格式本文不再做记录。可以参考文章《视音频编解码学习工程:FLV封装格式分析器》。本文的程序实现了FLV中的FLV Header和Tag的解析,并可以分离出其中的音频流。代码整个程序位于simplest_fl

2016-09-28 18:25:36 1200

原创 H.264视频码流解析

原理H.264原始码流(又称为“裸流”)是由一个一个的NALU组成的。他们的结构如下图所示。其中每个NALU之间通过startcode(起始码)进行分隔,起始码分成两种:0x000001(3Byte)或者0x00000001(4Byte)。如果NALU对应的Slice为一帧的开始就用0x00000001,否则就用0x000001。H.264码流解析的步骤就是首先从码流中搜索0x000001和0x00000001,分离出NALU;然后再分析NALU的各个字段。本文的程序即实现了上述的两个步骤。

2016-09-28 17:08:46 1122

原创 一个完整直播app功能分析

1.一个完整直播app功能1、聊天私聊、聊天室、点亮、推送、黑名单等;2、礼物普通礼物、豪华礼物、红包、排行榜、第三方充值、内购、礼物动态更新、提现等;3、直播列表关注、热门、最新、分类直播用户列表等;4、自己直播录制、推流、解码、播放、美颜、心跳、后台切换、主播对管理员操作、管理员对用户等;5、房间逻辑创建房间、

2016-09-28 15:04:29 19308 1

原创 AVFrame

AVPacketAVPacket定义在avcodec.h中FFMPEG使用AVPacket来暂存解复用之后、解码之前的媒体数据(一个音/视频帧、一个字幕包等)及附加信息(解码时间戳、显示时间戳、时长等)。其中:dts 表示解码时间戳,pts表示显示时间戳,它们的单位是所属媒体流的时间基准。stream_index 给出所属媒体流的索引;data 为数据缓冲区指针,size为

2016-09-28 11:04:57 1305

原创 AVFormatContext

AVFormatContext这个结构体描述了一个媒体文件或媒体流的构成和基本信息这是FFMpeg中最为基本的一个结构,是其他所有结构的根,是一个多媒体文件或流的根本抽象。其中:nb_streams和streams所表示的AVStream结构指针数组包含了所有内嵌媒体流的描述;iformat和oformat指向对应的demuxer和muxer指针;pb则指向一个控制底层数据读写的Byt

2016-09-28 10:57:14 1611

原创 AVStream

AVStream该结构体描述一个媒体流主要域的释义如下,其中大部分域的值可以由av_open_input_file根据文件头的信息确定,缺少的信息需要通过调用av_find_stream_info读帧及软解码进一步获取:index/id:index对应流的索引,这个数字是自动生成的,根据index可以从AVFormatContext::streams表中索引到该流;而id则是流的标

2016-09-28 10:41:35 1645

原创 AVCodecContext

AVCodecContext这是一个描述编解码器上下文的数据结构,包含了众多编解码器需要的参数信息如果是单纯使用libavcodec,这部分信息需要调用者进行初始化;如果是使用整个FFMPEG库,这部分信息在调用 av_open_input_file和av_find_stream_info的过程中根据文件的头信息及媒体流内的头部信息完成初始化。其中几个主要 域的释义如下:extra

2016-09-28 10:40:24 1081

原创 AVCodec

AVCodec是存储编解码器信息的结构体const char *name:编解码器的名字,比较短const char *long_name:编解码器的名字,全称,比较长enum AVMediaType type:指明了类型,是视频,音频,还是字幕enum AVCodecID id:ID,不重复const AVRational *supported_framerates:支持

2016-09-28 10:39:20 2571

原创 FFMPEG中结构体

FFMPEG中结构体很多。最关键的结构体可以分成以下几类:解协议(http,rtsp,rtmp,mms)AVIOContext,URLProtocol,URLContext主要存储视音频使用的协议的类型以及状态。URLProtocol存储输入视音频使用的封装格式。每种协议都对应一个URLProtocol结构。(注意:FFMPEG中文件也被当做一种协议“file”)解封装(flv,a

2016-09-28 10:38:01 379

原创 FFmpeg常用推流命令

FFmpeg常用推流命令一、FFmpeg推RTMP流准备工作首先确保自已已经安装了nginx + rtmp服务器。打开配置文件nginx.conf完成如下配置nginx配置.1如果没有nginx + rtmp服务器,请阅读我的另一篇简书文章Mac搭建nginx+rtmp服务器二、FFmpeg推流1.推流MP4文件视频文件地址:/Users/x

2016-09-27 18:21:13 19521 4

原创 SPS和PPS

SPS和PPS串,包含了初始化H.264解码器所需要的信息参数,包括编码所用的profile,level,图像的宽和高,deblock滤波器等。SPS:序列参数集。PPS:图像参数集。在H264码流中,都是以"0x00 0x00 0x01"或者"0x00 0x00 0x00 0x01"为开始码的,找到开始码之后,使用开始码之后的第一个字节的低5位判断是否为7(sps)或者8(pps), 及data

2016-09-27 17:19:56 3502

原创 H.264 NAL头解析

H.264 NAL头解析如果NALU对应的Slice为一帧的开始,则用4字节表示,即0x00000001;否则用3字节表示,0x000001。NAL Header:forbidden_bit,nal_reference_bit(优先级)2bit,nal_unit_type(类型)5bit。标识NAL单元中的RBSP数据类型,其中,nal_unit_type为1, 2, 3, 4, 5的

2016-09-27 17:17:55 733 2

原创 H.264压缩

H.264的压缩方法:1.分组:把几帧图像分为一组(GOP,也就是一个序列),为防止运动变化,帧数不宜取多。2.定义帧:将每组内各帧图像定义为三种类型,即I帧、B帧和P帧;3.预测帧:以I帧做为基础帧,以I帧预测P帧,再由I帧和P帧预测B帧;4.数据传输:最后将I帧数据与预测的差值信息进行存储和传输。帧内(Intraframe)压缩也称为空间压缩(Spatial compr

2016-09-27 17:15:55 1112

原创 H.264:i帧,p帧,b帧

i帧:帧内编码帧,i帧表示关键帧,它保留了一副画面完整的数据信息,解码的时候只需要这归真数据就可以完成(因为i帧里面包含了花面狸免得所有信息)。i帧的特点:1:它是一个全帧压缩编码帧,它将全帧图像信息进行JPEG压缩编码以及传输。2:解码的时候只需要通过i帧的数据就可以重构完整的图像。3:i帧描述了图像背景和运动主题的详情4:i帧不需要参考其他画面二

2016-09-27 17:14:16 898

原创 H.264视频编码

H.264是国际标准化组织(ISO)和国际电信联盟(ITU)共同提出的继MPEG4之后的新一代数字视频压缩格式,它即保留了以往压缩技术的优点和精华又具有其他压缩技术无法比拟的许多优点。1.低码流(Low Bit Rate):和MPEG2和MPEG4 ASP等压缩技术相比,在同等图像质量下,采用H.264技术压缩后的数据量只有MPEG2的1/8,MPEG4的1/3。显然,H.264压缩技术的

2016-09-27 17:11:21 767

转载 将视频 YUV 格式编码成 H264

首先开始的时候我们插入一张雷神大大的图帮助大家理解一下我们今天的操作究竟属于那一步。音视频格式封装层次从上图可以看出我们要做的,就是将像素层的 YUV 格式,编码出编码层的 h264数据。前面讲到我们已经成功编译出 iOS 中可用的 ffmpeg 的库了,那么我们首先熟悉一下今天我们要用到的 ffmpeg 中的函数和结构体AVFormatContext: 数据文件操

2016-09-23 18:11:43 24759 16

Reveal 20最新破解器

最新的Reveal版本破解工具,一键破解,很方便,欢迎使用

2019-01-23

Reveal 20最新

最新版Reveal

2019-01-17

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除