GPUImage实现摄像头暂停

GPUImage相信很多开发者都用过,其本身也是十分简单易用,因此对于GPUImage的基本用法不再赘述。

最近在使用GPUImage时要实现摄像时暂停和继续的功能,但GPUImage本身并没有提供相关的接口。查看GPUImageVideoCamera 中的相关代码,可以发现

- (void)pauseCameraCapture;方法。但这个方法会令GPUImage显示的摄像头捕捉的画面也暂停,这显然不是一个好的方案。

但- (void)pauseCameraCapture;这个方法却能给我们带来解决问题的思路。查看GPUImage源代码:

- (void)pauseCameraCapture;

{

capturePaused = YES;

}

在这里只是简单地设置了一个暂停的标志。那这个标志在什么地方用到呢。继续看代码:

- (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer;

{

if (capturePaused)

{

return;

}

.....

}

在处理视频帧的地方,如果暂停了就直接返回,用这种方法来实现暂停。

显然我们可以采用类似的方法来处理,但是首先我们要找到在哪里处理。如果使用过GPUImageVideoCamera,大致都会知道视频帧的流向。

如图,首先是GPUImageVideoCamera获取视频帧,将其传给filter,然后filter再将视频帧传给GPUImageView和

。前者用来显示摄像头捕捉到的图像,后者用来保存视频。

我们要实现暂停(显示的图像不暂停)显然只能在GPUImageMovieWriter这个环节来实现了。

继续看代码,找到GPUImageMovieWriter这个类中处理视频帧的的方法。

- (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex;

要怎么改写看个人具体情况了,可以直接修改,继承或者用category。本人采用的是继承的方式。

增加个标志,暂停就直接返回,否则调用父类的方法处理。看起来好像没问题,写个demo测试一下,发现视频暂停后,到继续的那段时间里不是直接跳过,而是

一直显示暂停时的那一帧图像。这是因为视频帧是带有时间戳的,虽然丢弃了暂停时的视频帧,但是时间戳还是原来的值,所以就出现了这种奇怪的情况。

继续修改时间戳:

- (void)configure{

_timeOffset = CMTimeMake(0, 1);

_isDisCount = NO;

_isPause = NO;

_isAudioOn = YES;

_offSet = kCMTimeZero;

}

- (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex{

if (_isPause) {

return;

}

if (_isDisCount) {

_isDisCount = NO;

_offSet = CMTimeSubtract(frameTime, _last);

if (_offSet.value > 0) {

_timeOffset = CMTimeAdd(_timeOffset, _offSet);

}

}

_last = frameTime;

frameTime = CMTimeSubtract(frameTime, _timeOffset);

[super newFrameReadyAtTime:frameTime atIndex:textureIndex];

}

改完再测试一下,暂停和恢复摄像正常了,没有什么问题。但是,视频末尾出现了有一小段时间播放最后一帧的情况,这是什么问题。

如果你录音声音正常的话就可以听到最后一段视频卡住了,但音频还是正常播放的。这是因为,我们只处理了图像帧,而没有处理音频

的缘故。

找到相关的方法,简单地return一下就好了。

- (void)processAudioBuffer:(CMSampleBufferRef)audioBuffer

{

if (_isPause) {

return;

}

[super processAudioBuffer:audioBuffer];

}

大概是GPUImageMovieWriter中处理了,音频会被按照顺序直接连接在一起,修改时间没用。

所以,如果想实现音频暂停(按照时间播放,中间有一段没声音)的话会比较麻烦。一种是可以记录暂停时间,在录音完之后进行剪辑。

另一种可以插入空的音频帧(没试过)。

时间: 2024-08-24 23:43:33

GPUImage实现摄像头暂停的相关文章

如何暂停网络摄像头

如果谁会 GPUImage实现摄像头暂停 软件  请联系 我  18945818128  必有重谢

GPUImage

GPUImage是一个非常棒的图像处理的开源库,里面提供了非常非常多的滤镜效果来加工图片. 不过就是因为太多效果了,而且对于程序员来说,那么多效果并不清楚知道要用那一个.于是我就使用提供的默认值,加上对滤镜的命名的理解,粗略简单地对GPUImage.h里引用的各个滤镜进行简要说明.这样方便以后找到想要的滤镜效果.其中可能有理解错误,或者表达不准确的地方还请大家斧正.其中有些效果需要使用摄像头才可能有比较理想的效果. 附上注释的GPUImage.h代码: #import "GLProgram.h&

GPUImage ==> 一个基于GPU图像和视频处理的开源iOS框架

Logo 项目介绍: GPUImage是Brad Larson在github托管的开源项目. GPUImage是一个基于GPU图像和视频处理的开源iOS框架,提供各种各样的图像处理滤镜,并且支持照相机和摄像机的实时滤镜: 基于GPU的图像加速,因此可以加速对实时摄像头视频.电影以及image的滤镜和其它效果处理,并且能够自定义图像滤镜.另外, GPUImage支持ARC. 使用GPUImage处理图片比Core Image更简单,只需要将过滤器赋给图片对象即可,不用考虑context或者设备等其

关于开源框架GPUImage 的简单说明

GPUImage是一个非常棒的图像处理的开源库,里面提供了非常非常多的滤镜效果来加工图片. 不过就是因为太多效果了,而且对于程序员来说,那么多效果并不清楚知道要用那一个.于是我就使用提供的默认值,加上对滤镜的命名的理解,粗略简单地对GPUImage.h里引用的各个滤镜进行简要说明.这样方便以后找到想要的滤镜效果.其中可能有理解错误,或者表达不准确的地方还请大家斧正.其中有些效果需要使用摄像头才可能有比较理想的效果. 附上注释的GPUImage.h代码: #import "GLProgram.h&

GPUImage学习笔记

不定期更新,详情请参阅云笔记 http://note.youdao.com/noteshare?id=d6562c5aa0741d2bb7436d7890d96ae2 2017.3.2 github源码地址,https://github.com/MrZhaozhirong/GPUImage 工程里面的app->GLCameraInstaller可以直接使用.欢迎大家学习. 初步认识GLSurfaceView预览摄像头.然后就出现很多问题: 第一个问题就是 setRotationCamera 接口

iOS:GPUImage强大的图像处理框架

GPUImage是一个非常棒的图像处理的开源库,里面提供了非常非常多的滤镜效果来加工图像. 不过就是因为太多效果了,而且对于程序员来说,那么多效果并不清楚知道要用那一个.于是我就使用提供的默认值,加上对滤镜的命名的理解,粗略简单地对GPUImage.h里引用的各个滤镜进行简要说明.这样方便以后找到想要的滤镜效果.其中可能有理解错误,或者表达不准确的地方还请大家斧正.其中有些效果需要使用摄像头才可能有比较理想的效果. #import "GLProgram.h" // Base class

Raspberry Pi 摄像头模块应用程序文档翻译

http://dreamcolor.net/archives/raspicam-documentation.html —————————————————————————————————————————————————————————————————————— Raspberry Pi 摄像头模块应用程序文档翻译 更新日志: 2014 年 3 月 24 日更新:根据 2013 年 12 月更新的文档,对原译文进行扩展翻译.翻译完毕. 2014 年 3 月 4 日更新:根据 2013 年 12 月更

GPUImage原理

GPUImage是一个开元的基于GPU的图片或视频的处理框架,其本身内置了多达120多种常见的滤镜效果,并且支持照相机和摄像机的实时滤镜,并且能够自定义图像滤镜. 美颜的基本概念 OpenGL ES:开源嵌入式系统图形的处理框架,一套图形与硬件接口,创造了软件与图形加速间灵活强大的底层交互接口.用于把处理好的图片显示到屏幕上. GPU:(图形处理单元)手机或者电脑用于图像处理和渲染的硬件. GPU工作原理:CPU指定显示器工作,显示控制器根据CPU的控制到指定的地方去取数据和指令,目前的数据一般

摄像头操作:WPFMediaKit(from www.sysoft.net.cn)

1.主程序中头部加入: xmlns:WPFMediaKit="clr-namespace:WPFMediaKit.DirectShow.Controls;assembly=WPFMediaKit"> 2.主窗口中加入一个提供选择摄 像头的combox <comboBox name="caps" ></comboBox> 3.加入wpfmediakit控件 <WPFMediaKit:VideoCaptureElement x:Nam