Application Development Manual
成都创新互联公司专业为企业提供庆元网站建设、庆元做网站、庆元网站设计、庆元网站制作等企业网站建设、网页设计与制作、庆元企业网站模板建站服务,10年庆元做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。
Gstreamer是一个支持Windows,Linux,Android, iOS的跨平台的多媒体框架,应用程序可以通过管道(Pipeline)的方式,将多媒体处理的各个步骤串联起来,达到预期的效果。每个步骤通过元素(Element)基于GObject对象系统通过插件(plugins)的方式实现,方便了各项功能的扩展。
GStreamer 的核心功能是为插件、数据流和媒体类型处理/协商提供框架。它还提供了一个 API 来使用各种插件编写应用程序。
GStreamer 提供
Gstreamer框架根据各个模块的成熟度以及所使用的开源协议,将core及plugins置于不同的源码包中:
Element是Gstreamer中最重要的对象类型之一。一个element实现一个功能(读取文件,解码,输出等),程序需要创建多个element,并按顺序将其串连起来(使用管道 ! ),构成一个完整的pipeline。
官方Elements与Plugins Lists
element主要有三种:
pads 是元素与外界的接口,有两个属性定义:方向和可用性。两个element必须通过pad才能连接起来,在element通过pad连接成功后,数据会从上一个element的src pad传到下一个element的sink pad然后进行处理。一个element可以同时拥有多个相同的pad。
bin 是一个容器元素,用于管理多个element。由于 bin 本身就是一个元素,因此可以以与任何其他元素相同的方式处理 bin。改变bin的状态时,bin会自动去修改所包含的element的状态,也会转发所收到的消息。如果没有bin,我们需要依次操作我们所使用的element。通过bin降低了应用的复杂度。
Pipeline继承自bin,为程序提供一个bus用于传输消息,并且对所有子element进行同步。当将pipeline的状态设置为PLAYING时,pipeline会在一个/多个新的线程中通过element处理数据。
示例:通过下面的命令播放文件时,会创建如下pipeline:
这个pipeline由8个element构成,每个element都实现各自的功能:
filesrc读取文件,oggdemux解析文件,分别提取audio,video数据,queue缓存数据,vorbisdec解码audio,autoaudiosink自动选择音频设备并输出;theoradec解码video,videoconvert转换video数据格式,autovideosink自动选择显示设备并输出。
参考 Installing on Linux
API reference
示例应用helloworld.c
编译应用
千峰扣丁学堂iOS开发为您解答:
1、Core
OS层:位于iOS框架的最底层,主要包含内核、文件系统、网络基础架构、安全管理、电源管理、设备驱动、线程管理、内存管理等。简而言之,该层提供了最低级的、系统级的服务。
2、Core
Services层:可称之为核心服务层,顾名思义,它提供诸如字符串管理、集合管理、网络操作、URL实用工具、联系人管理、偏好设置等服务。除此之外,它还提供很多基于硬件特性的服务,如GPS、加速仪、陀螺仪等。该层包含了Core
Location、Core Motion、SystemConfiguration、Foundation与Core
Foundation子模块。其中Foundation与Core Foundation子模块提供了对公共数据类型(字符串、集合等)的抽象,Core
Foundation中的Core Data子模块可以实现对象图形管理与对象持久化。
3、Media层:依赖于Core
Services层提供的功能,主要负责图形与多媒体服务。它包含了CoreGraphics、Core Text、OpenGL ES、Core
Animation、AVFoundation、Core Audio等与图形、视频和音频相关的功能模块。
4、Cocoa
Touch层:是直接向iOS应用程序提供各种基础功能的支持。其中的UIKit框架提供各种可视化控件供应用程序使用,如窗口、视图、视图控制器与各种用户控件等。另外UIKit也定义了应用程序的默认行为和事件处理结构。
iOS操作系统除过最底层的内核,其上总共分为四层,从上到下依次是:
最上层的Cocoa Touch层直接和用户进行交互,比如最常用的UIKit中的各种控件就属于此层,以及最核心的基础服务Foundation框架,以及地图MapKit等。
Media媒体层为上层的Cocoa Touch提供画图和多媒体服务,比如文字、图像、音视频处理等。
核心服务层为Application提供基础的系统服务,比如数据存储框架Core Data、安全服务Security、网络访问CFNetwork等,以及最重要的Foundation和CoreFoundation,它们是Objective-C的核心。
核心操作系统层为其上所有层提供最基础的服务,比如内存管理、线程管理、本地认证、文件系统、电源管理等,是底层的硬件和上层各种服务之间的接口。
使用AVFoundation拍照和录制视频
需要开发自定义的拍照和录制视频功能,可借助于AVFoundation框架来实现,该框架提供了大量的类来完成拍照和录制视频.主要使用如下类:
AVCaptureDevice :该对象代表物理输入设备,包括摄像头和麦克风.开发者可通过该对象来配置底层物理设备的属性.需要指出的是,
我们不能直接创建该类的实例,只能通过该类的 devices、defaultDeviceWithMediaType:(NSString *)mediaType、
devicesWithMediaType:(NSString *)mediaType方法 来获取对应的输入设备数组,接下来即 可获取前置摄像头、后置摄像头或麦克风,
程序就可设置该对象的对焦模式、闪光灯模式、曝光补偿、白平衡 等各种拍照相关属性。
注意:
在配置摄像头的相关属性之前,必须先调用lockForConfiguration:方法执行锁定,配置完成后调用unlockForConfiguration方法解锁。
AVCaptureSession :该对象负责把AVCaptureDevice捕捉得到的视频或声音数据输出到输出设备中.不管执行实时的还是离线的录制,开发者都必须创建AVCaptureSession对象,并为该对象添加输入设备(负责捕捉数据)和输出端(负责接收数据).例如如下代码片段
AVCaptureDeviceInput [BL2] :它是AVCaptureInput的子类,使用该对象从AVCaptureDevice设备获取数据,该对象将会被添加给AVCaptureSession管理.
AVCaptureScreenInput [BL3] :它是AVCaptureInput的子类,使用该对象从屏幕获取数据(用于录制屏幕动作).该对象将会被添加给AVCaptureSeesion管理
AVCaptureAudioDataOutput、AVCaptureAudioPreviewOutput、AVCaptureFileOutput [BL4] 、AVCaptureStillImageOutput、AVCaptureVideoDataOutput:它们都是AVCaptureOutput的子类,用于接收各种数据.该对象也会被添加给AVCaptureSession管理.其中AVCaptureFileOutput依然代表输出到文件的输出端,
AVCaptureAudioFileOutput [BL5] 、AVCaptureMovieFileOutput [BL6] :它们都是AVCaptureFileOutput的子类,分别代表输出到音频文件、电影文件的输出端。
AVCaptureVideoPreviewLayer:该对象是CALayer的子类,开发者只要创建它的实例,并为它设置AVCaptureSession,就可以非常方便地用它来实现拍摄预览.
代
码
片
段
使用AVFoundation实现拍照和录制视频的大致步骤如下
1
使用AVCaptureDevice的静态方法获取设备,包括摄像头和麦克风都可通过这种方式来获取
2
利用AVCaptureDevice初始化AVCaptureDeviceInput对象,无论摄像头还是麦克风都可通过这种方式转换为AVCaptureInput对象
3
初始化输出端.如果只是拍照,则初始化AVCaptureStillImageOutput输出端即可;如果要捕捉视频,则初始化AVCaptureMovieFileOutput输出端.
4
创建AVCaptureSession对象,使用该对象来添加输入设备和输出端.调用AVCaptureSession的startRunning方法开始捕捉画面或声音数据.
5
将捕捉的数据(照片、视频数据)输出到指定文件。
框架
AVFoundation.framework框架,AssetsLibrary.framework,CoreMedia.framework框架
使用AVFoundation生成视频缩略图
AVFoundation可用来生成视频缩略图.
AVFoundation生成视频缩略图主要靠如下两个类.
AVURLAsset
该类是AVAsset的子类,AVAsset类专门用于获取多媒体的相关信息,包括获取多媒体的画面、声音等信息。而AVURLAsset子类的作用则是根据NSURL来初始化AVAsset对象。
AVAssetImageGenerator [BL7]
该类专门用于截取视频指定帧的画面。
使用AVFoundation生成视频缩略图的步骤如下:
1
根据视频的NSURL创建AVURLAsset对象
2
根据AVURLAsset对象创建AVAssetImageGenerator对象
3
调用AVAssetImageGenerator对象的copyCGImageAtTime:actualTime:error:方法来获取该视频指定时间点的视频截图.该方法的第一个CMTime参数用于指定获取哪个时间点的视频截图,第2个CMTime参数用于获取实际截图 位于哪个时间点.
其中CMTime是专门用于标识电影时间的结构体,通常用如下两个函数来创建CMTime.
CMTimeMake(int64_t value, int_32 timescale): 第1个参数代表获取第几帧的截图,第2个参数代表每秒的帧数.因此实际截取的时间点是value/timescale.
CMTimeMakeWithSeconds(Float64 seconds, int32_t preferredTimeScale): 第1个参数代表获取第几秒的截图,第2个参数则代表每秒的帧数.
代码片段
// 为增加UIImage增加一个类别,通过在该类别中为UIImage增加一个imageWithVideo:方法来获取视频的缩略图
// UIImage + Video.m
@implementation UIImage (Video)
+ (UIImage *)imageWithVideo:(NSURL *)vidoURL
{
// 根据视频的URL创建AVURLAsset
AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:videoURL options:nil];
// 根据AVURLAsset创建AVAssetImageGenerator对象
AVAssetImageGenerator* gen = [[AVAssetImageGenerator alloc] initWithAsset: asset];
gen.appliesPreferredTrackTransform = YES;
// 定义获取0帧处的视频截图
CMTime time = CMTimeMake(0, 10);
NSError *error = nil;
CMTime actualTime;
// 获取time处的视频截图
CGImageRef image = [gen copyCGImageAtTime: time actualTime: actualTime error:error];
// 将CGImageRef转换为UIImage
UIImage *thumb = [[UIImage alloc] initWithCGImage: image];
CGImageRelease(image);
return thumb;
}
@end
ViewController.m
@interface ViewController: UIViewController
@property (nonatomic, strong) UIImageView *iv;
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
// 获取URL
NSURL *videoUrl = [[NSBundle mainBundle]
URLForResource:@”movie” withExtension:@”mp4”];
// 生成视频的缩略图
UIImage *image = [UIImage imageWithVideo:videoUrl];
self.iv.image = image;
}
@end
[BL1] Session: 会议
[BL2] 设备获取数据
[BL3] 用于录制屏幕动作
[BL4] 代表输出到文件的输出端
[BL5] 输出到音频文件的输出端
[BL6] 输出到电影文件的输出端