首页
学习
活动
专区
圈层
工具
发布

在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方法将视频数据写入文件。

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

相关·内容

鸿蒙开发:DevEco Studio中截屏和录屏功能

前言本文API>=13,基于DevEco Studio 5.1.0 Release,版本号5.1.0.828在真机调试应用的时候,如果你想进行截取设备中的页面,或者是录制一段视频,完成之后,在电脑上进行使用或者查看...除了以上的两种方式之外,其实在DevEco Studio中,已经集成了截屏和录屏功能,我们完全可以使用自带的功能,帮助我们来实现,相对其他的方式,则更加的简单和便捷。...无论是截屏还是录屏,我们需要注意,都是必须要连接设备的,可以是模拟器,也可以是真机。截屏功能工具截屏打开底部的log日志控制台,在左侧有一个相机图标,这个就是截图功能。...工具录屏打开底部的log日志控制台,在左侧有一个录像机图标,这个就是录屏功能。点击之后,和截屏功能一样,都需要选择要保存的位置。...hdc shell mediatool query test.mp4 -u相关总结截屏和录屏都有两种实现方式,建议使用第一种即可,简单便捷,在实际的开发中,如果有需要向他人展示正在开发的应用的各种功能时

12100

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.7K30
  • Android SurfaceVeiw划矩形截屏存放到RecyclerView中

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

    1.3K30

    机器学习在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.3K30

    机器学习在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.3K80

    在Objective-C中浅谈面向对象

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

    1.2K60

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

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

    1K50

    不想横屏看视频?谷歌开源框架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.6K20

    在React Native中构建启动屏

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

    2.6K10

    在 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 函数形式的位置编码。 打个比方,我们输入模型的序列,无论是句子、视频序列还是股票市场价格数据,都将始终是时域信号。...如果我们巧妙地使用这个波动方程,我们可以在一次拍摄中捕获词嵌入的时间和维度信息。 让我们看一下这个等式,在接下来的步骤中,我们将尝试把它形象化。 ?...这是我对注意力机制中使用的位置编码的看法。在接下来的系列中,我将尝试撰写有关编码器-解码器部分的内容,并将注意力应用于现实世界的规模问题。

    2.5K41

    在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.2K70
    领券