孙同生的博客

为美好的世界献上祝福

  • 首页
  • 标签
  • 分类
  • 归档
  • d3学习demo演示
  • 搜索

AVFoundation-视频处理

发表于 2016-12-06 | 更新于 2018-11-23 | 分类于 essay , AVFoundation | 评论数: | 阅读次数:
本文字数: 17k | 阅读时长 ≈ 15 分钟

之前在 AVFoundation拍照和录像 中使用 AVCaptureMovieFileOutput类来捕捉 QuickTime影片,这个类定义了捕捉视频数据的简单方法。当对捕捉到的视频数据进行更底层的操作时,就需要用到 AVCaptureVideoDataOutput

AVCaptureVideoDataOutputSampleBufferDelegate

与AVCaptureMovieFileOutput的委托回调不同,AVCaptureVideoDataOutput的委托回调为AVCaptureVideoDataOutputSampleBufferDelegate

它定义了一下两个方法:

  • - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection;
    • 每当有一个视频帧写入该方法就会被调用
  • - (void)captureOutput:(AVCaptureOutput *)captureOutput didDropSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection NS_AVAILABLE(10_7, 6_0);
    • 每当一个迟到的视频帧被丢弃时,就会被调用。通常是因为 在didOutputSampleBuffer中调用了耗时的操作。

CMSampleBufferRef

CMSampleBufferRef将基本的样本数据进行封装并提供格式和时间信息,还会家伙是哪个所有在转换和处理数据时用到的元数据。

阅读全文 »

AVFoundation-高帧率捕捉

发表于 2016-12-01 | 更新于 2018-11-23 | 分类于 essay , AVFoundation | 评论数: | 阅读次数:
本文字数: 12k | 阅读时长 ≈ 11 分钟

以高帧率(FPS)捕捉视频内容带来很多好处

AVCaptureDeviceFormat实例具有 videoSupportedFrameRateRanges 属性,它包含一个AVFrameRateRange对象数组,其中带有格式所支持的最小帧率、最大帧率和时长信息。

确定是否支持高帧率

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
@implementation AVCaptureDevice (THAdditions)

//是否支持高帧率
- (BOOL)supportsHighFrameRateCapture {
if (![self hasMediaType:AVMediaTypeVideo]) { // 1
return NO;
}
return [self findHighestQualityOfService].isHighFrameRate; // 2
}

//查找设备所支持的帧率等信息
- (THQualityOfService *)findHighestQualityOfService {

AVCaptureDeviceFormat *maxFormat = nil;
AVFrameRateRange *maxFrameRateRange = nil;

for (AVCaptureDeviceFormat *format in self.formats) {

FourCharCode codecType = // 3
CMVideoFormatDescriptionGetCodecType(format.formatDescription);

if (codecType == kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange) { // 4

NSArray *frameRateRanges = format.videoSupportedFrameRateRanges;

for (AVFrameRateRange *range in frameRateRanges) { // 5
if (range.maxFrameRate > maxFrameRateRange.maxFrameRate) {
maxFormat = format;
maxFrameRateRange = range;
}
}
}
}

return [THQualityOfService qosWithFormat:maxFormat // 6
frameRateRange:maxFrameRateRange];

}
//开启高帧率
- (BOOL)enableMaxFrameRateCapture:(NSError **)error {

THQualityOfService *qos = [self findHighestQualityOfService];

if (!qos.isHighFrameRate) { // 1
if (error) {
NSString *message = @"Device does not support high FPS capture";
NSDictionary *userInfo = @{NSLocalizedDescriptionKey : message};

NSUInteger code = THCameraErrorHighFrameRateCaptureNotSupported;

*error = [NSError errorWithDomain:THCameraErrorDomain
code:code
userInfo:userInfo];
}
return NO;
}


if ([self lockForConfiguration:error]) { // 2

CMTime minFrameDuration = qos.frameRateRange.minFrameDuration;

self.activeFormat = qos.format; // 3
self.activeVideoMinFrameDuration = minFrameDuration; // 4
self.activeVideoMaxFrameDuration = minFrameDuration;

[self unlockForConfiguration];
return YES;
}
return NO;
}


@end
阅读全文 »

AVFoundation-人脸识别

发表于 2016-11-30 | 更新于 2018-11-23 | 分类于 essay , AVFoundation | 评论数: | 阅读次数:
本文字数: 18k | 阅读时长 ≈ 16 分钟

Core Image框架中定义了CIDetector和CUFaceFeature,它们使用起来提供了简单而强大的人脸检测功能
但是这些方法没有针对实时性进行优化,在AVFoundation中通过特定的AVCaptureOutput类型的 AVCaptureMetadataOutput也可以实现人脸检测。

当使用人脸检测时,会输出一个具体子类类型AVMetadataFaceObject。AVMetadataFaceObject 定义了多个用户描述被检测到的人脸的属性,最重要的是人脸的边界(bounds),还给出了用于定义检测人脸倾斜角(roll angle)表示人的头部向肩膀方向侧倾角度,偏转角(yaw angle)表示人脸绕y轴旋转的角度。

配置会话与之前使用摄像头拍照类似,区别在于更换一个output,如:

阅读全文 »

AVFoundation-缩放

发表于 2016-11-24 | 更新于 2018-11-23 | 分类于 essay , AVFoundation | 评论数: | 阅读次数:
本文字数: 11k | 阅读时长 ≈ 10 分钟

iOS7以前使用AVCaptureConnection

通过 AVCaptureConnection 的属性对摄像头缩放进行有限制的支持,开发者可以通过调整连接缩放的值从默认的1.0增加到 videoMaxScaleAndCropFactor 属性定义的最大值

需要用到AVCaptureConnection的两个属性

  • @property(nonatomic) CGFloat videoScaleAndCropFactor
  • @property(nonatomic, readonly) CGFloat videoMaxScaleAndCropFactor

videoScaleAndCropFactor这个属性取值范围是1.0-videoMaxScaleAndCropFactor

阅读全文 »

AVFoundation-拍照和录像

发表于 2016-11-17 | 更新于 2018-11-23 | 分类于 essay , AVFoundation | 评论数: | 阅读次数:
本文字数: 59k | 阅读时长 ≈ 54 分钟

使用AV Foundation 捕捉照片和视频

使用AVFoundation拍照和录制视频的一般步骤如下:

  1. 创建AVCaptureSession对象。
  2. 使用AVCaptureDevice的静态方法获得需要使用的设备,例如拍照和录像就需要获得摄像头设备,录音就要获得麦克风设备。
  3. 利用输入设备AVCaptureDevice初始化AVCaptureDeviceInput对象。
  4. 初始化输出数据管理对象,如果要拍照就初始化AVCaptureStillImageOutput对象;如果拍摄视频就初始化AVCaptureMovieFileOutput对象。
  5. 将数据输入对象AVCaptureDeviceInput、数据输出对象AVCaptureOutput添加到媒体会话管理对象AVCaptureSession中。
  6. 创建视频预览图层AVCaptureVideoPreviewLayer并指定媒体会话,添加图层到显示容器中,调用AVCaptureSession的startRuning方法开始捕获。
  7. 将捕获的音频或视频数据输出到指定文件。
阅读全文 »

AVFoundation-AVPlayer视频播放

发表于 2016-10-28 | 更新于 2018-11-23 | 分类于 essay , AVFoundation | 评论数: | 阅读次数:
本文字数: 26k | 阅读时长 ≈ 23 分钟

AV Player是一个用来播放给予时间的视听媒体的控制器对象。将视频资源导出到界面需要使用AVPlayerLayer类;AVPlayer只管理一个单独资源的播放,当需要播放多个音频资源可以使用子类AVQueuePlayer

不需要自定义播放器的情况可以使用 MPMoviewPlayerController

参考 http://www.cnblogs.com/kenshincui/p/4186022.html#avPlayer

初始化

示例:

1
2
3
4
5
6
7
NSURL *assetURL = [[NSBundle mainBundle] URLForResource:@"waves" withExtension:@"mp4"];
AVAsset *asset = [AVAsset assetWithURL:assetURL];
AVPlayerItem *playeritem = [AVPlayerItem playerItemWithAsset:asset];
self.player = [AVPlayer playerWithPlayerItem:playerItem];
AVPlayerLayer *playerLayer = [AVPlayer playerLayerWithPlayer:self.player];
//playerLayer.videoGravity=AVLayerVideoGravityResizeAspect;//视频填充模式
[self.view.layer addSubLayer:playerLayer];
阅读全文 »

AudioToolbox-播放和录制音频

发表于 2016-10-20 | 更新于 2018-11-23 | 分类于 essay , AVFoundation | 评论数: | 阅读次数:
本文字数: 21k | 阅读时长 ≈ 19 分钟

使用System Sound Service播放音效

参考 http://www.cnblogs.com/kenshincui/p/4186022.html

步骤

  1. 调用AudioServicesCreateSystemSoundID( CFURLRef inFileURL, SystemSoundID* outSystemSoundID)函数获得系统声音ID。
  2. 如果需要监听播放完成操作,则使用AudioServicesAddSystemSoundCompletion( SystemSoundID inSystemSoundID, CFRunLoopRef inRunLoop, CFStringRef inRunLoopMode, AudioServicesSystemSoundCompletionProc inCompletionRoutine, void* inClientData)方法注册回调函数。
  3. 调用AudioServicesPlaySystemSound(SystemSoundID inSystemSoundID) 或者AudioServicesPlayAlertSound(SystemSoundID inSystemSoundID) 方法播放音效(后者带有震动效果)。

示例:

阅读全文 »

Runtime 实践

发表于 2016-10-13 | 更新于 2019-03-07 | 分类于 重学iOS , Runtime | 评论数: | 阅读次数:
本文字数: 29k | 阅读时长 ≈ 26 分钟

介绍

  • dynamicWebkit替换、
  • 动态添加方法 + 动态交换方法 -> UIButton防止多次点击、
  • 遍历变量 -> 隐藏键盘、
  • 遍历属性 -> 获取属性名
  • 遍历属性 -> 判断所有变量是否已经实例化
阅读全文 »

Runtime 使用

发表于 2016-10-13 | 更新于 2019-03-07 | 分类于 重学iOS , Runtime | 评论数: | 阅读次数:
本文字数: 42k | 阅读时长 ≈ 38 分钟

主要包含 字典与模型互转 、对象关联、遍历变量、遍历方法、遍历协议

阅读全文 »

xcodebuild命令

发表于 2016-10-10 | 更新于 2019-03-07 | 分类于 重学iOS | 评论数: | 阅读次数:
本文字数: 9.7k | 阅读时长 ≈ 9 分钟

xcodebuild 生成app以及生成ipa文件

阅读全文 »
<i class="fa fa-angle-left" aria-label="上一页"></i>1…6789<i class="fa fa-angle-right" aria-label="下一页"></i>
SunTongSheng

SunTongSheng

移动端 前端 跨平台

85 日志
22 分类
27 标签
RSS
© 2026 SunTongSheng | 532k | 8:04