首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在Objective-C 截屏视频中编码?

在Objective-C中截屏视频,可以通过以下步骤实现:

  1. 首先,需要导入AVFoundation框架,以便使用视频编码和处理功能。
  2. 创建一个AVCaptureSession实例,并设置视频输入源。
  3. 创建一个AVAssetWriter实例,并设置视频输出格式。
  4. 使用AVCaptureVideoDataOutput将捕获到的视频数据写入AVAssetWriter中。
  5. 当需要停止截屏时,调用AVAssetWriter的finishWriting方法,将视频数据写入文件。

以下是一个简单的示例代码:

代码语言:objective-c
复制
#import <AVFoundation/AVFoundation.h>

@interface ViewController () <AVCaptureVideoDataOutputSampleBufferDelegate>

@property (nonatomic, strong) AVCaptureSession *captureSession;
@property (nonatomic, strong) AVCaptureVideoDataOutput *videoOutput;
@property (nonatomic, strong) AVCaptureConnection *videoConnection;
@property (nonatomic, strong) AVAssetWriter *assetWriter;
@property (nonatomic, strong) AVAssetWriterInput *videoWriterInput;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    // 创建捕获会话
    self.captureSession = [[AVCaptureSession alloc] init];
    self.captureSession.sessionPreset = AVCaptureSessionPresetHigh;
    
    // 创建视频输入源
    AVCaptureDevice *videoDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    NSError *error = nil;
    AVCaptureDeviceInput *videoInput = [AVCaptureDeviceInput deviceInputWithDevice:videoDevice error:&error];
    if (error) {
        NSLog(@"Error: %@", error.localizedDescription);
        return;
    }
    [self.captureSession addInput:videoInput];
    
    // 创建视频输出
    self.videoOutput = [[AVCaptureVideoDataOutput alloc] init];
    self.videoOutput.videoSettings = @{(id)kCVPixelBufferPixelFormatTypeKey : @(kCVPixelFormatType_32BGRA)};
    self.videoOutput.alwaysDiscardsLateVideoFrames = YES;
    [self.captureSession addOutput:self.videoOutput];
    
    // 设置视频输出代理
    dispatch_queue_t queue;
    queue = dispatch_queue_create("videoOutputQueue", DISPATCH_QUEUE_SERIAL);
    [self.videoOutput setSampleBufferDelegate:self queue:queue];
    
    // 创建视频写入器
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"output.mp4"];
    NSURL *outputURL = [NSURL fileURLWithPath:filePath];
    self.assetWriter = [[AVAssetWriter alloc] initWithURL:outputURL fileType:AVFileTypeMPEG4 error:&error];
    if (error) {
        NSLog(@"Error: %@", error.localizedDescription);
        return;
    }
    
    // 设置视频编码器
    NSDictionary *videoCompressionProperties = @{(id)kVTCompressionPropertyKey_ProfileLevel: (id)kVTProfileLevel_H264_High_4_0,
                                                    (id)kVTCompressionPropertyKey_AverageBitRate: @(1000000)};
    NSDictionary *videoOutputSettings = @{(id)kCVPixelBufferPixelFormatTypeKey : @(kCVPixelFormatType_32BGRA),
                                            (id)kCVPixelBufferWidthKey : @(self.view.bounds.size.width),
                                            (id)kCVPixelBufferHeightKey : @(self.view.bounds.size.height),
                                            (id)kCVPixelBufferBytesPerRowAlignmentKey : @(4),
                                            (id)kCVPixelBufferCGBitmapContextCompatibilityKey : @(YES),
                                            (id)kCVPixelBufferCGImageCompatibilityKey : @(YES),
                                            (id)kCVPixelBufferIOSurfacePropertiesKey : @{}};
    self.videoWriterInput = [[AVAssetWriterInput alloc] initWithMediaType:AVMediaTypeVideo outputSettings:videoOutputSettings];
    self.videoWriterInput.expectsMediaDataInRealTime = YES;
    self.videoWriterInput.transform = CGAffineTransformMakeScale(-1, 1);
    [self.assetWriter addInput:self.videoWriterInput];
    
    // 开始捕获视频
    [self.captureSession startRunning];
}

- (void)captureOutput:(AVCaptureOutput *)output didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection {
    if (self.videoWriterInput.readyForMoreMediaData) {
        if (self.videoConnection == nil) {
            self.videoConnection = connection;
        }
        if (connection == self.videoConnection) {
            [self.videoWriterInput appendSampleBuffer:sampleBuffer];
        }
    }
}

- (void)dealloc {
    [self.captureSession stopRunning];
    [self.assetWriter finishWritingWithCompletionHandler:^{
        NSLog(@"视频已保存");
    }];
}

@end

这段代码将捕获屏幕上的视频,并将其写入一个MP4文件中。在视频捕获过程中,可以通过AVCaptureVideoDataOutputSampleBufferDelegate协议的回调方法captureOutput:didOutputSampleBuffer:fromConnection:来处理每一帧视频数据。在视频捕获结束时,可以通过AVAssetWriter的finishWriting方法将视频数据写入文件。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

android视频&手机录实现代码

本文介绍了android视频&手机录实现代码,分享给大家,希望对大家有帮助 问题 android中有时候我们需要对屏幕进行操作,单一的操作好解决可以通过activity的顶层view...Bitmap.createBitmap(bmp, 0, 0, dm.widthPixels, dm.heightPixels); view.destroyDrawingCache(); 如果activity包含一些视频播放器比如...SurfaceView GLSurfaceView TextureView,调用代码会发现播放视频的部分是黑屏的,原因是这几种视频渲染的view通过以上代码拿到的是缓冲区不是真正的图像。...这里通过Service来操作和录的api 1.绑定的Service Intent intent = new Intent(this, ScreenService.class); bindService...获取 @Override public void onClick(View view) { //######## 逻辑 ######## Bitmap bitmap = recordService.getBitmap

3.3K32

Qt音视频开发49-通用截图

有时候还有一种场景需求是不需要原始的图片,只需要当前通道大小的尺寸,这个时候就需要对当前通道进行,采用的形式截图,这种方式可以将设置的OSD等信息都截图进去,相当于扣扣截图。...Qt本身提供了grabWindow方法来对指定句柄的窗体控件,Qt4里面放在QPixmap类的静态方法QPixmap::grabWindow,而Qt5放在QApplication::primaryScreen...支持图片地图,设备按钮可以图片地图上自由拖动自动保存位置信息。 百度地图和图片地图上,双击视频可以预览摄像头实时视频。 堆栈窗体,每个窗体都是个单独的qwidget,方便编写自己的代码。...pro文件可以自由开启是否加载地图。 视频播放可选2种内核自由切换,vlc+ffmpeg,均可在pro设置。...thread->snap(); #endif return this->image; } QPixmap FFmpegWidget::getPixmap() const { //采用的形式截图

1.6K30
  • Android SurfaceVeiw划矩形存放到RecyclerView

    前一篇文章《Android SurfaceView onTouchEvent进阶操作OpenCV显示》我们已经实现了SurfaceView划矩形显示源图上,本章我们将结合前几天学习的东西把划的图形保存到...MainActivity定义与RecyclerView相关的参数,然后写了一个初始化的RecyclerView的方法。...VaccaeSurfaceView: 定义了回调函数BitmapCallBack mCallback 写了初始化的ontouchEvent的方法,用于手指抬起后保存图片再使用坐标点恢复初始。...nv21ToBitmap的方法我们重新写了一个调用的JNI,返回的List集合,其中第一张为我们的原图,第二张是我们截取出来的图,然后把第二张图回调函数中加入发送过去。...前面的基本差不多,上图中就是当传递进来isovertouch后我们就开始把矩形的图出来加入到返回的LIst列表

    1.2K30

    机器学习HEVC 视频编码的实践

    作者介绍:张宏顺,08年硕士毕业后桑达电子集团工作,负责车牌自动识别系统及车辆自动检测系统设计;11年加入华为,主要负责图像处理及视频压缩相关算法工作;15年6月加入腾讯,现主要从事视频和图片压缩相关工作...背景与目标 当前视频编码应用最广泛的是AVC(H.264),而HEVC(H.265)作为下一代的视频编码算法,压缩性能上可以再节省40%的码率,优势很明显,但H.265对转码机器性能要求较高,实时编码场景时...x265有ultrafast、veryfast、fast、medium、slow、slower、veryslow等配置,其中,veryslow对应复杂度最高,压缩性能也最好,不同CPU配置下,对1080p...因此,我们期待在保证压缩比少量下降情况下,显著提高视频编码的处理能力。...首先,创建编码器的同时,将预测模型加载到编码;然后,计算当前CU块时,提取上述8个特征值,组成预测样本,归一化后,送给预测模型,经简单计算,会输出-1或1两种情况。

    4.1K30

    机器学习HEVC 视频编码的实践

    背景与目标 当前视频编码应用最广泛的是AVC(H.264),而HEVC(H.265)作为下一代的视频编码算法,压缩性能上可以再节省40%的码率,优势很明显,但H.265对转码机器性能要求较高,实时编码场景时...x265有ultrafast、veryfast、fast、medium、slow、slower、veryslow等配置,其中,veryslow对应复杂度最高,压缩性能也最好,不同CPU配置下,对1080p...视频测试,编码速度如下表: ?...因此,我们期待在保证压缩比少量下降情况下,显著提高视频编码的处理能力。 问题分析 一个标准的HEVC编码框架如下: ?...首先,创建编码器的同时,将预测模型加载到编码;然后,计算当前CU块时,提取上述8个特征值,组成预测样本,归一化后,送给预测模型,经简单计算,会输出-1或1两种情况。

    1.2K80

    Objective-C浅谈面向对象

    每种OOP的语言面向对象上或多或少都会有不同的地方,现在在学习OC的面向对象部分,又感觉到OC面向对象的特点。写篇博文总结一下OC的面向对象。...刚接触OC,用OC的便利初始化方法和便利构造器有点蹩脚,不过还可以接受的范围之内,以下的东西可能会对面向对象的特征:抽象,封装,继承等总结的较少一些,主要总结了OC面向对象的特点。...简单的说来,便利构造器是为了简化对象的初始化而生的,之前的博客也说了一嘴:编程是间接的过程,其实使用便利构造器就是间接的过程。程序处处都用到了间接。...OC类是由接口(interface)和实现(implementation)两部分构成的。OC类是通过两个单独的文件定义。....面向对象父类可以声明子类的变量     ​    ​    ​    ​    ​3.

    1.1K60

    视频编码编码和计算效率对比

    演讲主题是视频编码编码和计算效率对比。 此次演讲主要包括五个部分: 1. 视频编码的历史回顾 2. 视频编码的多线程 3. 时间分片作为视频编码的“均衡器” 4....实验结论 作者首先简单回顾了以下视频编码的历史发展:从一开始面向专业内容的编码,到面向消费者视频内容的编码,进而发展为面向流媒体的云端编码编码面向的对象也从单片发展为块和镜头。...作者接着介绍了多线程视频编码的优缺点:多线程处理可以很很高的减少延迟但是却容易引起比特率的损失,而且由于线程之前的同步问题,会导致计算资源利用率降低。...这也就是第三部分的主题,合理利用时间分片作为视频编码的均衡器。并且作者还对云端视频编码这一应用场景,总结了不同层级的并行处理的优缺点。 接着作者介绍了他进行的一组实验,并给出了具体的实验设置。...最后,作者总结了此次实验得出的几个结论: a) 计算复杂度/压缩效率域中的凸包方法产生最佳编码器/预设操作点; b) 基于时间的并行处理提供了最大的优势,同时具有最少的缺点;

    95950

    不想横视频?谷歌开源框架AutoFlip一键出最精彩竖版视频

    项目地址:https://github.com/google/mediapipe 使用过程,只需要将一段视频和目标维度(如截取的长宽比类型)作为输入,AutoFlip 会分析视频内容并提出一个优化路径和裁剪策略...每一个镜头中,它会使用视频分析识别重构场景之前的重要内容,其重构场景主要通过选择针对内容优化的相机模式和路径。 ? 视频裁剪三步走,检测镜头级的视频边界、分析视频内容然后再根据需求进行剪裁。...得出剪辑策略前,AutoFlip 会缓存整个视频,用于对整个场景进行优化。 ? 视频内容分析 为了从视频中找到有趣的剪辑片段,AutoFlip 采用了深度学习目标检测模型。...剪辑 每一帧找到了兴趣目标后,AutoFlip 自动选择优化策略——静态的、追拍或追踪的,这些取决于目标视频的行为。...如果覆盖所有需要的区域不能实现(如目标一帧视频显得太大),AutoFlip 则会自动切换到相对不那么激进的策略上。

    1.1K20

    属性“__attribute__”Objective-C的应用

    属性“__attribute__”Objective-C的应用       关于__attribute__,你可能用的不多,但是一定经常见到,系统的Foundation框架,__attribute...这是一种非常强大的机制,实际应用也非常频繁,例如对以一个拥有模块化和路由功能的应用程序,可以通过这种方式来自动化的进行路由注册(无需手动调用),需要注意,constructor与destructor...8. objc_requires_super       这个属性用来修饰Objective-C父类的方法,如果子类进行了重写,重写的方法没有调用父类方法,则会进行编译器提示。...实际编程,很多时候,都是由于子类重写了父类的方法造成不可预知的问题,通过使用这个属性可以有效的对开发者进行提示,例如: ?...11. objc_runtime_name       这是一个很有趣的属性,其可以运行时改变Objective-C类的类名,但是不会影响其行为。

    2.3K20

    React Native构建启动

    在网络应用,我们使用预加载器为用户提供动画娱乐,同时服务器操作正在处理。尽管这听起来很直接,但它是构建和保留用户群的关键工具。 React Native创建启动有很多好处。...同样的情况也适用于启动,因为应用程序启动时立即显示加载器可以帮助你在用户等待应用程序准备就绪时,向他们展示一个有组织的,设计良好的显示界面。...Native 构建启动需要一些微调。...为了 iOS 为启动屏幕强制使用一致的背景,滚动到背景设置位置并从下拉菜单中选择 Custom。弹出窗口中,选择启动屏幕的期望颜色。...我们的例子,我们选择了白色: 为了确认你的应用可以成功运行,请从Xcode运行一个构建。

    51610

    Android关于屏幕的三个小众知识(宽适配、禁止和保持屏幕常亮)

    禁止 像支付宝付款二维码这种对安全要求比较高的界面,应用一般会选择屏蔽设备功能。当你同时按下快捷键组合(常见为开机键 + 音量上键)时,系统会自动提示失败等关联信息。...禁止的实现方式并不是很难,需要设置禁止的 Activity 的生命周期 onCreate() 方法添加一行代码即可: getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE...意思就是设置了这个flag后, 系统会把当前窗口的内容视为安全隐私内容, 系统会阻止这些内容被或者不安全可靠的场景显示出来....Google的过程, 发现这个flag可以实现以下功能: 阻止屏幕截图 Recent apps(任务切换界面)只显示应用名字和图标, 不显示内容 Google App的Now on tap功能不会去分析你的页面的内容...实现起来也很简单,像禁止一样,需要的 Activity 的 onCreate() 生命周期方法添加代码: getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON

    1.7K10

    retina 实现1 px border 效果

    作者:link 街景 wap 官网中有视网膜屏幕实现1px border 的需求。 首先,来看下面视觉给的输出图中的 border: 从上面的视觉图可以看到,border 是一根非常细的线。...这篇文章将说明如何使用 border-image 实现在视网膜1px 的 border 效果。...注:因为硬件条件的限制,设备像素比(devicePixelRatio)为1的非视网膜手机无法达到这样的效果 首先准备一张符合你要求的 border-image: 通常手机端的页面设计稿都是放大一倍的...但是我们发现这样的方法非视网膜上会出现border显示不出来的现象,于是使用Media Query做了一些兼容,样式设置如下: .border-image-1px { border-bottom...但是使用box-shadow与使用border类似,代码量少,使用方便,而且可以设置圆角矩形,精细度要求不高的情况下可以尝试使用这种方案。

    1.2K00

    位置编码注意机制的作用

    然而, Transformer 网络,如果编码器包含一个前馈网络,那么只传递词嵌入就等于为您的模型增加了不必要的混乱,因为词嵌入没有捕获有关句子的顺序信息。...为了处理单词相对位置的问题,位置编码的想法出现了。 在从嵌入层提取词嵌入后,位置编码被添加到这个嵌入向量。 解释位置编码最简单的方法是为每个单词分配一个唯一的数字 ∈ ℕ 。...为了克服这个问题,本文使用了 sin 和 cosine 函数形式的位置编码。 打个比方,我们输入模型的序列,无论是句子、视频序列还是股票市场价格数据,都将始终是时域信号。...如果我们巧妙地使用这个波动方程,我们可以一次拍摄捕获词嵌入的时间和维度信息。 让我们看一下这个等式,接下来的步骤,我们将尝试把它形象化。 ?...这是我对注意力机制中使用的位置编码的看法。接下来的系列,我将尝试撰写有关编码器-解码器部分的内容,并将注意力应用于现实世界的规模问题。

    2K41

    retina实现1px border效果

    街景wap官网中有视网膜屏幕实现1px border的需求. 首先,来看下面视觉给的输出图中的border: 从上面的视觉图可以看到,border是一根非常细的线。...这篇文章将说明如何使用border-image实现在视网膜1px的border效果。...注:因为硬件条件的限制,设备像素比(devicePixelRatio)为1的非视网膜手机无法达到这样的效果 首先准备一张符合你要求的border-image: 通常手机端的页面设计稿都是放大一倍的...但是我们发现这样的方法非视网膜上会出现border显示不出来的现象,于是使用Media Query做了一些兼容,样式设置如下: .border-image-1px { border-bottom...但是使用box-shadow与使用border类似,代码量少,使用方便,而且可以设置圆角矩形,精细度要求不高的情况下可以尝试使用这种方案。

    1.1K70
    领券