JavaShuo
栏目
标签
调用系统UIImagePickerController录像并保存到指定的文件夹
时间 2019-11-18
标签
调用
系统
uiimagepickercontroller
录像
保存
指定
文件夹
繁體版
原文
原文链接
版权声明:本文为博主原创文章,未经博主容许不得转载。
xcode
[objc]
view plain
copy
#pragma mark - 录像
- (
void)recodVideo{
if ([UIImagePickerController
isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
UIImagePickerController* pickerView = [[UIImagePickerController
alloc]
init];
pickerView
.sourceType = UIImagePickerControllerSourceTypeCamera;
NSArray* availableMedia = [UIImagePickerController
availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera];
pickerView
.mediaTypes = [NSArray
arrayWithObject:availableMedia[
1]];
pickerView
.videoQuality = UIImagePickerControllerQualityTypeMedium;
[
self
pushVieCtr:pickerView];
// pickerView.videoMaximumDuration = 60;
pickerView
.delegate =
self;
[pickerView
release];
}
}
[objc]
view plain
copy
#pragma mark - UIImagePickerControllerDelegate
- (
void)imagePickerController:(
UIImagePickerController *)picker
didFinishPickingMediaWithInfo:(
NSDictionary *)info
{
_videoURL = [info[UIImagePickerControllerMediaURL]
retain];
NSLog(
@"_videoURL = %@",_videoURL);
[picker
.flipboardNavigationController
popViewController];
[
self
encodeVideoOrientation:_videoURL];
NSLog(
@"_videoURL.absoluteString %@",_videoURL
.path);
// NSString *videoPath = _videoURL.path;
// if (UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(videoPath)) {
// UISaveVideoAtPathToSavedPhotosAlbum(videoPath, self, NULL, NULL);
// }
}
[objc]
view plain
copy
- (
void)encodeVideoOrientation:(
NSURL *)anOutputFileURL
{
_alert = [[UIAlertView
alloc]
init];
[_alert
setTitle:
@"Waiting.."];
UIActivityIndicatorView* activity = [[UIActivityIndicatorView
alloc]
initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
activity
.frame = CGRectMake(
1
4
0,
8
0,
CGRectGetWidth(_alert
.frame),
CGRectGetHeight(_alert
.frame));
[_alert
addSubview:activity];
[activity
startAnimating];
[activity
release];
[_alert
show];
[_alert
release];
_startDate = [[NSDate
date]
retain];
AVURLAsset * videoAsset = [[AVURLAsset
alloc]initWithURL:anOutputFileURL
options
:nil];
AVAssetExportSession * assetExport = [[AVAssetExportSession
alloc]
initWithAsset:videoAsset
presetName:AVAssetExportPresetMediumQuality];
NSDateFormatter* formater = [[NSDateFormatter
alloc]
init];
[formater
setDateFormat:
@"yyyy-MM-dd-HH:mm:ss"];
_mp
4Path = [[NSHomeDirectory()
stringByAppendingFormat:
@"/Documents/videos/%@.mp4", [formater
stringFromDate:[NSDate
date]]]
retain];
[formater
release];
assetExport
.outputURL = [NSURL
fileURLWithPath:
_mp4Path];
assetExport
.shouldOptimizeForNetworkUse =
YES;
assetExport
.outputFileType = AVFileTypeMPEG
4;
assetExport
.videoComposition = [
self
getVideoComposition:videoAsset];
[assetExport
exportAsynchronouslyWithCompletionHandler:^{
switch ([assetExport
status]) {
case
AVAssetExportSessionStatusFailed:
{
NSLog(
@"AVAssetExportSessionStatusFailed!");
[_alert
dismissWithClickedButtonIndex:
0
animated:
NO];
[
self
performSelectorOnMainThread:
@selector(converFailed:)
withObject:assetExport
waitUntilDone:
NO];
break;
}
case
AVAssetExportSessionStatusCancelled:
NSLog(
@"Export canceled");
[_alert
dismissWithClickedButtonIndex:
0
animated:
YES];
break;
case
AVAssetExportSessionStatusCompleted:
NSLog(
@"Successful!");
[
self
performSelectorOnMainThread:
@selector(convertFinish)
withObject
:nil
waitUntilDone:
NO];
break;
default:
break;
}
[assetExport
release];
}];
}
#pragma mark - 解决录像保存角度问题
-(
AVMutableVideoComposition *)
getVideoComposition:(
AVAsset *)asset
{
AVAssetTrack *videoTrack = [[asset
tracksWithMediaType:AVMediaTypeVideo]
objectAtIndex:
0];
AVMutableComposition *composition = [AVMutableComposition
composition];
AVMutableVideoComposition *videoComposition = [AVMutableVideoComposition
videoComposition];
CGSize videoSize = videoTrack
.naturalSize;
BOOL isPortrait_ = [
self
isVideoPortrait:asset];
if(isPortrait_) {
NSLog(
@"video is portrait ");
videoSize = CGSizeMake(videoSize
.height, videoSize
.width);
}
composition
.naturalSize = videoSize;
videoComposition
.renderSize = videoSize;
// videoComposition.renderSize = videoTrack.naturalSize; //
videoComposition
.frameDuration = CMTimeMakeWithSeconds(
1 / videoTrack
.nominalFrameRate,
6
0
0);
AVMutableCompositionTrack *compositionVideoTrack;
compositionVideoTrack = [composition
addMutableTrackWithMediaType:AVMediaTypeVideo
preferredTrackID:kCMPersistentTrackID_Invalid];
[compositionVideoTrack
insertTimeRange:CMTimeRangeMake(kCMTimeZero, asset
.duration)
ofTrack:videoTrack
atTime:kCMTimeZero
error
:nil];
AVMutableVideoCompositionLayerInstruction *layerInst;
layerInst = [AVMutableVideoCompositionLayerInstruction
videoCompositionLayerInstructionWithAssetTrack:videoTrack];
[layerInst
setTransform:videoTrack
.preferredTransform
atTime:kCMTimeZero];
AVMutableVideoCompositionInstruction *inst = [AVMutableVideoCompositionInstruction
videoCompositionInstruction];
inst
.timeRange = CMTimeRangeMake(kCMTimeZero, asset
.duration);
inst
.layerInstructions = [NSArray
arrayWithObject:layerInst];
videoComposition
.instructions = [NSArray
arrayWithObject:inst];
return videoComposition;
}
[objc]
view plain
copy
-(
BOOL)
isVideoPortrait:(
AVAsset *)asset
{
BOOL isPortrait = FALSE;
NSArray *tracks = [asset
tracksWithMediaType:AVMediaTypeVideo];
if([tracks
count] >
0) {
AVAssetTrack *videoTrack = [tracks
objectAtIndex:
0];
CGAffineTransform t = videoTrack
.preferredTransform;
// Portrait
if(t
.a ==
0 && t
.b ==
1
.0 && t
.c == -
1
.0 && t
.d ==
0)
{
isPortrait =
YES;
}
// PortraitUpsideDown
if(t
.a ==
0 && t
.b == -
1
.0 && t
.c ==
1
.0 && t
.d ==
0) {
isPortrait =
YES;
}
// LandscapeRight
if(t
.a ==
1
.0 && t
.b ==
0 && t
.c ==
0 && t
.d ==
1
.0)
{
isPortrait = FALSE;
}
// LandscapeLeft
if(t
.a == -
1
.0 && t
.b ==
0 && t
.c ==
0 && t
.d == -
1
.0)
{
isPortrait = FALSE;
}
}
return isPortrait;
}
相关文章
1.
go保存文件到指定的文件夹
2.
IDEA保存sql文件到指定文件夹
3.
Java从指定URL下载文件并保存到指定目录
4.
把生成的json文件保存到指定项目文件夹
5.
linux find查找多个指定目录并复制到指定文件夹
6.
JMeter学习(十三)---jmeter下载文件保存到指定文件夹
7.
OpenCV调用摄像头录像并保存下来
8.
bat批处理复制指定目录及其子目录的指定后缀文件到指定文件夹
9.
系统找不到指定的文件
10.
bat 复制文件及文件夹 覆盖到指定目录
更多相关文章...
•
系统定义的TypeHandler
-
MyBatis教程
•
C# Windows 文件系统的操作
-
C#教程
•
Docker容器实战(七) - 容器眼光下的文件系统
•
三篇文章了解 TiDB 技术内幕——说存储
相关标签/搜索
系统调用
uiimagepickercontroller
文件夹
fcntl系统调用
保存
录像
指令系统
指挥系统
保定
软件系统
MySQL教程
网站建设指南
NoSQL教程
文件系统
调度
应用
0
分享到微博
分享到微信
分享到QQ
每日一句
每一个你不满意的现在,都有一个你没有努力的曾经。
最新文章
1.
eclipse设置粘贴字符串自动转义
2.
android客户端学习-启动模拟器异常Emulator: failed to initialize HAX: Invalid argument
3.
android.view.InflateException: class com.jpardogo.listbuddies.lib.views.ListBuddiesLayout问题
4.
MYSQL8.0数据库恢复 MYSQL8.0ibd数据恢复 MYSQL8.0恢复数据库
5.
你本是一个肉体,是什么驱使你前行【1】
6.
2018.04.30
7.
2018.04.30
8.
你本是一个肉体,是什么驱使你前行【3】
9.
你本是一个肉体,是什么驱使你前行【2】
10.
【资讯】LocalBitcoins达到每周交易比特币的7年低点
本站公众号
欢迎关注本站公众号,获取更多信息
相关文章
1.
go保存文件到指定的文件夹
2.
IDEA保存sql文件到指定文件夹
3.
Java从指定URL下载文件并保存到指定目录
4.
把生成的json文件保存到指定项目文件夹
5.
linux find查找多个指定目录并复制到指定文件夹
6.
JMeter学习(十三)---jmeter下载文件保存到指定文件夹
7.
OpenCV调用摄像头录像并保存下来
8.
bat批处理复制指定目录及其子目录的指定后缀文件到指定文件夹
9.
系统找不到指定的文件
10.
bat 复制文件及文件夹 覆盖到指定目录
>>更多相关文章<<