当前位置: 首页 > 编程日记 > 正文

iOS三种录制视频方式详细对比

先附上参考资料

http://www.jianshu.com/p/16cb14f53933

https://developer.apple.com/library/content/samplecode/AVSimpleEditoriOS/Introduction/Intro.html

https://github.com/objcio/VideoCaptureDemo

https://github.com/gsixxxx/DTSmallVideo

https://github.com/AndyFightting/VideoRecord

卷首吐槽语

这还是第一次接触自定义界面录制视频,包括各种参数的设置,不得不说,录制视频这块,各种类,各种方法,蛮复杂的,网上的资料也是各种杂乱,想要弄清楚还真是得费一番功夫,我参考了大量资料,根据自己的思路整理了一遍,按照我的思路来,保证你看一遍就会,我这里只是简单的录制,压缩,剪裁,导出等功能,不设计滤镜,添加背景音乐,合并,字幕等等,重要的是这个流程,主流程会了,其他也就是锦上添花了。

先附上dome demo地址

我的blog看更加方便,左侧有目录
点击进入我的blog文章地址

脑图

方便大家对三中录制方式有一个大概的了解,看一下这张图片。


基本属性与类


第一种采用系统的录制较为简单,详细介绍后面两种。

效果图


1

2

3

4

5

6

demo中把三种方式单独分开,便于学习。支持闪光灯,切换镜头,录制不同尺寸的视频等。

1.UIImagePickerController

这种方式只能设置一些简单参数,自定义程度不高,只能自定义界面上的操作按钮,还有视频的画质等。

- (void)viewDidLoad
{[super viewDidLoad];if ([self isVideoRecordingAvailable]) {return;}self.sourceType = UIImagePickerControllerSourceTypeCamera;self.mediaTypes = @[(NSString *)kUTTypeMovie];self.delegate = self;//隐藏系统自带UIself.showsCameraControls = NO;//设置摄像头[self switchCameraIsFront:NO];//设置视频画质类别self.videoQuality = UIImagePickerControllerQualityTypeMedium;//设置散光灯类型self.cameraFlashMode = UIImagePickerControllerCameraFlashModeAuto;//设置录制的最大时长self.videoMaximumDuration = 20;
}
- (BOOL)isVideoRecordingAvailable
{if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]){NSArray *availableMediaTypes = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera];if([availableMediaTypes containsObject:(NSString *)kUTTypeMovie]){return YES;}}return NO;
}- (void)switchCameraIsFront:(BOOL)front
{if (front) {if([UIImagePickerController isCameraDeviceAvailable:UIImagePickerControllerCameraDeviceFront]){[self setCameraDevice:UIImagePickerControllerCameraDeviceFront];}} else {if([UIImagePickerController isCameraDeviceAvailable:UIImagePickerControllerCameraDeviceRear]){[self setCameraDevice:UIImagePickerControllerCameraDeviceRear];}}
}

2.AVCaptureSession+AVCaptureMovieFileOutput

流程:

1. 创建捕捉会话
2. 设置视频的输入
3. 设置音频的输入
4. 输出源设置,这里视频,音频数据会合并到一起输出,在代理方法中国也可以单独拿到视频或者音频数据,给AVCaptureMovieFileOutput指定路径,开始录制之后就会向这个路径写入数据
5. 添加视频预览层
6. 开始采集数据,这个时候还没有写入数据,用户点击录制后就可以开始写入数据

0. 创建捕捉会话

 self.session = [[AVCaptureSession alloc] init];if ([_session canSetSessionPreset:AVCaptureSessionPreset640x480]) {//设置分辨率_session.sessionPreset=AVCaptureSessionPreset640x480;}

1. 视频的输入

   - (void)setUpVideo
{// 1.1 获取视频输入设备(摄像头)AVCaptureDevice *videoCaptureDevice=[self getCameraDeviceWithPosition:AVCaptureDevicePositionBack];//取得后置摄像头// 视频 HDR (高动态范围图像)// videoCaptureDevice.videoHDREnabled = YES;// 设置最大,最小帧速率//videoCaptureDevice.activeVideoMinFrameDuration = CMTimeMake(1, 60);// 1.2 创建视频输入源NSError *error=nil;self.videoInput= [[AVCaptureDeviceInput alloc] initWithDevice:videoCaptureDevice error:&error];// 1.3 将视频输入源添加到会话if ([self.session canAddInput:self.videoInput]) {[self.session addInput:self.videoInput];}
}

2. 音频的输入

// 2.1 获取音频输入设备AVCaptureDevice *audioCaptureDevice=[[AVCaptureDevice devicesWithMediaType:AVMediaTypeAudio] firstObject];NSError *error=nil;// 2.2 创建音频输入源self.audioInput = [[AVCaptureDeviceInput alloc] initWithDevice:audioCaptureDevice error:&error];// 2.3 将音频输入源添加到会话if ([self.session canAddInput:self.audioInput]) {[self.session addInput:self.audioInput];}

3.输出源设置

- (void)setUpFileOut
{// 3.1初始化设备输出对象,用于获得输出数据self.FileOutput=[[AVCaptureMovieFileOutput alloc]init];// 3.2设置输出对象的一些属性AVCaptureConnection *captureConnection=[self.FileOutput connectionWithMediaType:AVMediaTypeVideo];//设置防抖//视频防抖 是在 iOS 6 和 iPhone 4S 发布时引入的功能。到了 iPhone 6,增加了更强劲和流畅的防抖模式,被称为影院级的视频防抖动。相关的 API 也有所改动 (目前为止并没有在文档中反映出来,不过可以查看头文件)。防抖并不是在捕获设备上配置的,而是在 AVCaptureConnection 上设置。由于不是所有的设备格式都支持全部的防抖模式,所以在实际应用中应事先确认具体的防抖模式是否支持:if ([captureConnection isVideoStabilizationSupported ]) {captureConnection.preferredVideoStabilizationMode=AVCaptureVideoStabilizationModeAuto;}//预览图层和视频方向保持一致captureConnection.videoOrientation = [self.previewlayer connection].videoOrientation;// 3.3将设备输出添加到会话中if ([_session canAddOutput:_FileOutput]) {[_session addOutput:_FileOutput];}
}

4. 视频预览层

一进入视频录制界面,这个时候 session就已经在采集数据了,并把数据显示在预览层上,用户选择录制后,再将采集到的数据写入文件。

    - (void)setUpPreviewLayerWithType:(FMVideoViewType )type
{CGRect rect = CGRectZero;switch (type) {case Type1X1:rect = CGRectMake(0, 0, kScreenWidth, kScreenWidth);break;case Type4X3:rect = CGRectMake(0, 0, kScreenWidth, kScreenWidth*4/3);break;case TypeFullScreen:rect = [UIScreen mainScreen].bounds;break;default:rect = [UIScreen mainScreen].bounds;break;}self.previewlayer.frame = rect;[_superView.layer insertSublayer:self.previewlayer atIndex:0];
}

5. 开始采集画面

[self.session startRunning];

6.开始录制

- (void)writeDataTofile
{NSString *videoPath = [self createVideoFilePath];self.videoUrl = [NSURL fileURLWithPath:videoPath];[self.FileOutput startRecordingToOutputFileURL:self.videoUrl recordingDelegate:self];}

3.AVCaptureSession+AVAssetWriter

流程:

1. 创建捕捉会话
2. 设置视频的输入 和 输出
3. 设置音频的输入 和 输出
4. 添加视频预览层
5. 开始采集数据,这个时候还没有写入数据,用户点击录制后就可以开始写入数据
6. 初始化AVAssetWriter, 我们会拿到视频和音频的数据流,用AVAssetWriter写入文件,这一步需要我们自己实现。

1. 创建捕捉会话

需要确保在同一个队列,最好队列只创建一次

 self.session = [[AVCaptureSession alloc] init];if ([_session canSetSessionPreset:AVCaptureSessionPreset640x480]) {//设置分辨率_session.sessionPreset=AVCaptureSessionPreset640x480;}

2.设置视频的输入 和 输出

- (void)setUpVideo
{// 2.1 获取视频输入设备(摄像头)AVCaptureDevice *videoCaptureDevice=[self getCameraDeviceWithPosition:AVCaptureDevicePositionBack];//取得后置摄像头// 2.2 创建视频输入源NSError *error=nil;self.videoInput= [[AVCaptureDeviceInput alloc] initWithDevice:videoCaptureDevice error:&error];// 2.3 将视频输入源添加到会话if ([self.session canAddInput:self.videoInput]) {[self.session addInput:self.videoInput];}self.videoOutput = [[AVCaptureVideoDataOutput alloc] init];self.videoOutput.alwaysDiscardsLateVideoFrames = YES; //立即丢弃旧帧,节省内存,默认YES[self.videoOutput setSampleBufferDelegate:self queue:self.videoQueue];if ([self.session canAddOutput:self.videoOutput]) {[self.session addOutput:self.videoOutput];}}

3. 设置音频的输入 和 输出

- (void)setUpAudio
{// 2.2 获取音频输入设备AVCaptureDevice *audioCaptureDevice=[[AVCaptureDevice devicesWithMediaType:AVMediaTypeAudio] firstObject];NSError *error=nil;// 2.4 创建音频输入源self.audioInput = [[AVCaptureDeviceInput alloc] initWithDevice:audioCaptureDevice error:&error];// 2.6 将音频输入源添加到会话if ([self.session canAddInput:self.audioInput]) {[self.session addInput:self.audioInput];}self.audioOutput = [[AVCaptureAudioDataOutput alloc] init];[self.audioOutput setSampleBufferDelegate:self queue:self.videoQueue];if([self.session canAddOutput:self.audioOutput]) {[self.session addOutput:self.audioOutput];}}

4. 添加视频预览层

  - (void)setUpPreviewLayerWithType:(FMVideoViewType )type
{CGRect rect = CGRectZero;switch (type) {case Type1X1:rect = CGRectMake(0, 0, kScreenWidth, kScreenWidth);break;case Type4X3:rect = CGRectMake(0, 0, kScreenWidth, kScreenWidth*4/3);break;case TypeFullScreen:rect = [UIScreen mainScreen].bounds;break;default:rect = [UIScreen mainScreen].bounds;break;}self.previewlayer.frame = rect;[_superView.layer insertSublayer:self.previewlayer atIndex:0];
}

5. 开始采集画面

   [self.session startRunning];

6. 初始化AVAssetWriter

AVAssetWriter 写入数据的过程需要在子线程中执行,并且每次写入数据都需要保证在同一个线程。

- (void)setUpWriter
{self.videoUrl = [[NSURL alloc] initFileURLWithPath:[self createVideoFilePath]];self.writeManager = [[AVAssetWriteManager alloc] initWithURL:self.videoUrl viewType:_viewType];self.writeManager.delegate = self;}

7.拿到数据流后处理

视频数据和音频数据需要分开处理

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
{@autoreleasepool {//视频if (connection == [self.videoOutput connectionWithMediaType:AVMediaTypeVideo]) {if (!self.writeManager.outputVideoFormatDescription) {@synchronized(self) {CMFormatDescriptionRef formatDescription = CMSampleBufferGetFormatDescription(sampleBuffer);self.writeManager.outputVideoFormatDescription = formatDescription;}} else {@synchronized(self) {if (self.writeManager.writeState == FMRecordStateRecording) {[self.writeManager appendSampleBuffer:sampleBuffer ofMediaType:AVMediaTypeVideo];}}}}//音频if (connection == [self.audioOutput connectionWithMediaType:AVMediaTypeAudio]) {if (!self.writeManager.outputAudioFormatDescription) {@synchronized(self) {CMFormatDescriptionRef formatDescription = CMSampleBufferGetFormatDescription(sampleBuffer);self.writeManager.outputAudioFormatDescription = formatDescription;}}@synchronized(self) {if (self.writeManager.writeState == FMRecordStateRecording) {[self.writeManager appendSampleBuffer:sampleBuffer ofMediaType:AVMediaTypeAudio];}}}}}

我们拿到最原始的数据以后,可以对其进行各种参数的设置

- (void)setUpWriter
{self.assetWriter = [AVAssetWriter assetWriterWithURL:self.videoUrl fileType:AVFileTypeMPEG4 error:nil];//写入视频大小NSInteger numPixels = self.outputSize.width * self.outputSize.height;//每像素比特CGFloat bitsPerPixel = 6.0;NSInteger bitsPerSecond = numPixels * bitsPerPixel;// 码率和帧率设置NSDictionary *compressionProperties = @{ AVVideoAverageBitRateKey : @(bitsPerSecond),AVVideoExpectedSourceFrameRateKey : @(30),AVVideoMaxKeyFrameIntervalKey : @(30),AVVideoProfileLevelKey : AVVideoProfileLevelH264BaselineAutoLevel };//视频属性self.videoCompressionSettings = @{ AVVideoCodecKey : AVVideoCodecH264,AVVideoScalingModeKey : AVVideoScalingModeResizeAspectFill,AVVideoWidthKey : @(self.outputSize.height),AVVideoHeightKey : @(self.outputSize.width),AVVideoCompressionPropertiesKey : compressionProperties };_assetWriterVideoInput = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeVideo outputSettings:self.videoCompressionSettings];//expectsMediaDataInRealTime 必须设为yes,需要从capture session 实时获取数据_assetWriterVideoInput.expectsMediaDataInRealTime = YES;_assetWriterVideoInput.transform = CGAffineTransformMakeRotation(M_PI / 2.0);// 音频设置self.audioCompressionSettings = @{ AVEncoderBitRatePerChannelKey : @(28000),AVFormatIDKey : @(kAudioFormatMPEG4AAC),AVNumberOfChannelsKey : @(1),AVSampleRateKey : @(22050) };_assetWriterAudioInput = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeAudio outputSettings:self.audioCompressionSettings];_assetWriterAudioInput.expectsMediaDataInRealTime = YES;if ([_assetWriter canAddInput:_assetWriterVideoInput]) {[_assetWriter addInput:_assetWriterVideoInput];}else {NSLog(@"AssetWriter videoInput append Failed");}if ([_assetWriter canAddInput:_assetWriterAudioInput]) {[_assetWriter addInput:_assetWriterAudioInput];}else {NSLog(@"AssetWriter audioInput Append Failed");}self.writeState = FMRecordStateRecording;
}

设置好参数以后,就可以写入文件了。AVAssetWriter数据写入的过程有点复杂,demo中我新建AVAssetWriteManager分离出AVAssetWriter,单独处理写数据,这样逻辑会清晰一点。

fileOut和writer的相同点和不同点

从上面的两个流程大致可以看出来,
相同点:数据采集都在AVCaptureSession中进行,视频和音频的输入都一样,画面的预览一致。
不同点:
输出不一致, AVCaptureMovieFileOutput 只需要一个输出即可,指定一个文件路后,视频和音频会写入到指定路径,不需要其他复杂的操作。
AVAssetWriter 需要 AVCaptureVideoDataOutput 和 AVCaptureAudioDataOutput 两个单独的输出,拿到各自的输出数据后,然后自己进行相应的处理。

可配参数不一致,AVAssetWriter可以配置更多的参数。

视频剪裁不一致,AVCaptureMovieFileOutput 如果要剪裁视频,因为系统已经把数据写到文件中了,我们需要从文件中独到一个完整的视频,然后处理;而AVAssetWriter我们拿到的是数据流,还没有合成视频,对数据流进行处理,所以两则剪裁方式也是不一样。

其他添加背景音乐,水印等也是不一样的,这里没有涉及就不介绍了。到这里也差不多了,文章也有点长了。这些是我自己整理资料总结出来的,不排除会有一些错误之处,供大家学习参考,希望有所收获。如果方便,还请为我star一个,也算是对我的支持。

demo地址


相关文章:

C# 实现Oracle中的数据与Excel之间的转换

最近项目要求实现数据库之间数据在各个数据库之间导入导出,在此做个笔记 1. 将Oracle中的表导入到Excel中,反之亦然 private static readonly string connectionString ConfigurationManager.ConnectionStrings["OracleConnection"].Connecti…

【转】Word2007中不连续页码设置 多种页码设置

【转】Word2007中不连续页码设置 多种页码设置 页码是论文必不可少的部分。我们看一下如何添加页码,并且针对一些特殊的格式要求怎么应对: 如果是【毕业论文】有多种混合页码,有Ⅰ、Ⅱ、Ⅲ。。。还有1、2、3 。。。请直接看【第二种方法】。 …

vim编辑器异常退出产生备份文件

当非正常关闭vim编辑器时(比如直接关闭终端或者电脑断电),会生成一个.swp文件,这个文件是一个临时交换文件,用来备份缓冲区中的内容。 需要注意的是如果你并没有对文件进行修改,而只是读取文件&#xff0c…

从0到1思考与实现iOS-Widget

讲述之前首先看下demo效果图: 基本的展开收起、本App本体交互然后再展示几个效果不错的 Widget app 毒物 && KeepESPNPCalcMusixmatchFantastical 2Carrot Weatherdemo 地址在此!欢迎star 比心一、Widget总览 Widget 是 iOS8 推出第一版&…

Android Studio 初体验

Google在I/O2013大会上发布了Android新的开发工具Android Studio,趁周末时间做了一下尝试。有需要的可以在http://developer.android.com/sdk/installing/studio.html下载,当前版本是V0.1。官方解释:Android Studio is anew Android developm…

JAVA面试题(2)

1 String 与 new 的不同 使用“”赋值不一定每次都创建一个新的字符串,而是从“字符串实例池”中查找字符串。使用“new”进行赋值,则每次都创建一个新的字符串。 2 String与StringBuffer String类是不可变类,字符串一旦初始化后&#xff0c…

限制HTTP数据包发送Referer

一般点击一个A标签的时候都会发送 Referer 什么是 Referer&#xff1f; 就是你点击A标签 Referer的信息告诉服务端你从哪里点击出来的 可在HTML上加 <meta name"referrer" content"no-referrer">这样就不发送Referer头了

TCP/IP详解学习笔记(3)-IP协议,ARP协议,RARP协议

把这三个协议放到一起学习是因为这三个协议处于同一层&#xff0c;ARP协议用来找到目标主机的Ethernet网卡Mac地址&#xff0c;IP则承载要发送的消息。数据链路层可以从ARP得到数据的传送信息&#xff0c;而从IP得到要传输的数据信息。 1.IP协议 IP协议是TCP/IP协议的核心&…

数据结构与算法分析(C++版)(第二版)

查看书籍详细信息&#xff1a; 数据结构与算法分析&#xff08;C版&#xff09;&#xff08;第二版&#xff09; 内容简介 本书采用程序员最爱用的面向对象C语言来描述数据结构和算法&#xff0c;并把数据结构原理和算法分析技术有机地结合在一起&#xff0c;系统介绍了各种…

nginx反向代理原理讲解

一 、概述 反向代理&#xff08;Reverse Proxy&#xff09;方式是指以代理服务器来接受Internet上的连接请求&#xff0c;然后将请求转发给内部网络上的服务器&#xff1b;并将从服务器上得到的结果返回给Internet上请求连接的客户端&#xff0c;此时代理服务…

cojs 简单的数位DP 题解报告

首先这道题真的是个数位DP 我们考虑所有的限制&#xff1a; 首先第六个限制和第二个限制是重复的&#xff0c;保留第二个限制即可 第五个限制在转移中可以判断&#xff0c;不用放在状态里 对于第一个限制&#xff0c;我们可以增加一维表示余数即可 对于第四个限制也是同理 对于…

iOS ERROR ITMS - 打包上传报错整理

作者 Silence_广 关注 2017.03.24 11:12 字数 706 阅读 45评论 1喜欢 12ERROR ITMS-90034 ERROR ITMS-90034这个问题就是你的包里面的证书和开发者中心的证书不一样所以提交的时候回报错. 如果试过网上很多的解决方法之后&#xff08;诸如重新制作证书&#xff0c;删调过期证书…

照片墙瀑布流加载与阻止加载

网上大部分主流的瀑布流应用基本都是由后端在提供图片地址的同时提供图片宽高&#xff0c;这样&#xff0c;前端不必等待图片渲染完成&#xff0c;可以根据图片的宽高先把装载图片的容器或父节点先放上页面&#xff0c;完成基础性的布局&#xff0c;再让图片以渐变或其他方式逐…

利用Nginx实现简易负载均衡

基本思路如下&#xff1a; 比如我们有三个服务器&#xff1a; 其中: 130.251是反向代理转发服务器 130.251和130.238分别是负载服务器 Mysql服务器没有标出来, 为方便区分,我们先把1号负载的首页写成111111111 2号负载的首页写成222222 然后我们现在控制130.251, 把nginx配置文…

两行代码搞定iOS自定义HUD风格动画弹窗(支持选择记录) - SKChoosePopView的使用和实现思路

作者 ShevaKuilin 关注 2017.03.25 18:28* 字数 2014 阅读 270评论 0喜欢 23さらい屋五葉原文地址----> MyBlog HUD风格的选项弹窗是我们在日常开发中经常会碰到的一类需求&#xff0c;通常因为项目周期等因素&#xff0c;很少会专门抽出时间来对此类弹窗进行专门的定制开发…

yii2框架随笔29

今天我们来看UrlRule.php <?php /*** link http://www.yiiframework.com/* copyright Copyright (c) 2008 Yii Software LLC* license http://www.yiiframework.com/license/*/ namespace yii\web; use Yii; use yii\base\Object; use yii\base\InvalidConfigException; /*…

八种简易健康减肥瘦身法

①原地跑&#xff0c;紧实大腿肌肉&#xff1b;②上楼梯&#xff0c;瘦小腿、大腿、臀&#xff1b;③步行&#xff0c;瘦腿、腰&#xff1b;④瑜珈&#xff0c;瘦全身&#xff1b;⑤跳舞&#xff0c;瘦全身&#xff1b;⑥跳绳&#xff0c;瘦大腿、小腿&#xff1b;⑦晨操&#…

LaZagne检测windows本地存储的密码

LaZagne项目是用于检索存储在本地计算机上的大量密码的开源应用程序。 每个软件使用不同的技术&#xff08;明文&#xff0c;API&#xff0c;自定义算法&#xff0c;数据库等&#xff09;存储其密码。 该工具的开发是为了找到最常用的软件的密码。 下载到windows机器&#xff0…

通知提示SCPromptView

作者 陈小翰 关注 2017.03.24 18:01 字数 138 阅读 62评论 0喜欢 1SCPromptView SCPromptView : 显示在顶部的提示控件 你的star是我最大的动力 effect.gif安装 手动安装 下载源码&#xff0c;将SCPromptView文件夹拖进项目 CocoaPod pod SCPromptView 使用 SCPromptView 的用…

4566: [Haoi2016]找相同字符 SAM

折腾了好久。不过收获还是很多的。第一次自己去画SAM所建出来fail树。深入体会了这棵树的神奇性质。 当然&#xff0c;我最终靠着自己A掉了。&#xff08;这是我第一次推SAM的性质&#xff08;以前都是抄别人的&#xff0c;感觉自己好可耻&#xff09;&#xff0c;不过感觉好像…

NYOJ-232 How to eat more Banana

How to eat more Banana 时间限制&#xff1a;1000 ms | 内存限制&#xff1a;65535 KB难度&#xff1a;4描述A group of researchers are designing an experiment to test the IQ of a monkey. They will hang a banana at the roof of a building, and at the mean time, …

UIView Animation

作者 嘿o大远 关注 2017.03.23 17:02* 字数 402 阅读 47评论 1喜欢 3今天总结一下UIView动画就是 UiView动画是基于高层API封装进行封装的,对UIView的属性进行修改时候所产生的动画. 基本动画 下面两种方法是最常用的两种. (void)animateWithDuration:(NSTimeInterval)duratio…

[转]Ext Grid控件的配置与方法

http://www.blogjava.net/wangdetian168/archive/2011/04/12/348651.html 1、Ext.grid.GridPanel 主要配置项&#xff1a; store&#xff1a;表格的数据集 columns&#xff1a;表格列模式的配置数组&#xff0c;可自动创建ColumnModel列模式 autoExpandColumn&#xff1a;自动充…

永久设置SecureCRT的背景色和文字颜色方案

对于默认的连接颜色感觉不舒服&#xff0c;一通乱搞&#xff0c;总结出这些。 一、对于临时设置&#xff0c;可以如下操作&#xff1a; 首先options -- session - appearance 此处可以设置临时的窗口背景&#xff0c;字体颜色&#xff0c;大小等等&#xff0c;为什么说是临时&a…

利用Procdump+Mimikatz获取Windows帐户密码

0x01 前言&#xff1a; 前段时间拿下一个网站的shell&#xff0c;很幸运的是直接就是System权限&#xff0c;结果发现执行添加用户命令并不能成功回显 看了下系统进程&#xff0c;原来是开启了360的主动防御&#xff0c;奈何也不会做免杀&#xff0c;上传exp运行就被杀&#x…

一个逻辑清晰的购物车模型

效果图 2017-03-25 18.28.23.gifGitHub: https://github.com/lll1024/JVShopcart 说明 这是一个具备常规功能并方便改造的购物车模型 一共包含五个模块&#xff1a; JVShopcartViewController: 购物车控制器 负责协调Model和View 只有100多行代码JVShopcartFormat: 负责网络请求…

Nginx基本配置、性能优化指南

转载自&#xff1a;http://www.chinaz.com/web/2015/0424/401323.shtml 大多数的Nginx安装指南告诉你如下基础知识——通过apt-get&#xff0c;或yum安装&#xff0c;修改这里或那里的几行配置&#xff0c;好了&#xff0c;你已经有了一个Web服务器了&#xff01;而且&#xff…

关于批量修改AD域用户的脚本

最近几天帮人弄了个脚本&#xff0c;是修改域用户属性的脚本&#xff0c;今天看到徐火军写的 关于批量修改用户属性 脚本&#xff0c;觉得有必要把我的成果分享给大家。什么都不说了&#xff0c;上脚本&#xff1a; Dim oFSO, oTF, iDim sLineDim sLoginName 用户批量文件Const…

Python multiprocess 多进程模块

转发&#xff1a;http://www.langzi.fun/Python multiprocess 多进程模块.html 需要注意的是&#xff0c;如果使用多线程&#xff0c;用法一定要加上if __name____main__:(Python中的multiprocess提供了Process类&#xff0c;实现进程相关的功能。但是它基于fork机制&#xff…