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.
如何將PPT某一頁幻燈片導出爲高清圖片
2.
Intellij IDEA中使用Debug調試
3.
build項目打包
4.
IDEA集成MAVEN項目極簡化打包部署
5.
eclipse如何導出java工程依賴的所有maven管理jar包(簡單明瞭)
6.
新建的Spring項目無法添加class,依賴下載失敗解決:Maven環境配置
7.
記在使用vue-cli中使用axios的心得
8.
分享提高自己作品UI設計形式感的幾個小技巧!
9.
造成 nginx 403 forbidden 的幾種原因
10.
AOP概述(什麼是AOP?)——Spring AOP(一)
本站公眾號
歡迎關注本站公眾號,獲取更多信息
相關文章
1.
go保存文件到指定的文件夾
2.
IDEA保存sql文件到指定文件夾
3.
Java從指定URL下載文件並保存到指定目錄
4.
把生成的json文件保存到指定項目文件夾
5.
linux find查找多個指定目錄並複製到指定文件夾
6.
JMeter學習(十三)---jmeter下載文件保存到指定文件夾
7.
OpenCV調用攝像頭錄像並保存下來
8.
bat批處理複製指定目錄及其子目錄的指定後綴文件到指定文件夾
9.
系統找不到指定的文件
10.
bat 複製文件及文件夾 覆蓋到指定目錄
>>更多相關文章<<