본문 바로가기

길위의 흔적532

AVCaptureVideoDataOutput을 이용해서 카메라 만들기 2 - 녹화 AVCaptureVideoDataOutput을 이용해서 카메라 만들기 2 - 녹화 #.지난번 포스팅에 이어서 '녹화' 버튼을 클릭했을때 작동되는 로직 순서를 알아보자. 1.녹화버튼을 클릭 하면 IDCaptureSessionPipelineViewController클래스의 toggleRecording 메소드가 작동된다. 2.IDCaptureSessionAssetWriterCoordinator 클래스의 startRecording 진입해서 레코딩 상태변화를 시키기위해 transitionToRecordingStatus 메소드를 호출한다. // oldStatus : 0, newStatus: 1 3.IDCaptureSessionAssetWriterCoordinator 클래스의 startRecording 에서 계속해서.. 2019. 4. 17.
AVCaptureVideoDataOutput을 이용해서 카메라 만들기1 AVCaptureVideoDataOutput을 이용해서 카메라 만들기1 iOS 비디오 녹화 어플을 만들다가 생각지도 못한 난관에 봉착했다. 비디오를 녹화하는 도중에 녹화한 데이터크기를 실시간으로 체크하는 기능을 추가해야하는 상황이 발생했다. 젠장… AVCaptureMovieFileOutput을 이용해서 비디오를 커스터마이징 하고 있었는데, AVCaptureMovieFileOutput으로는 실시간으로 데이터를 체크가 불가능했다. 대신, AVCaptureVideoDataOutput 과 AVAssetWriter를 이용해야지 데이터 체크가 가능했다. 그리고 AVCaptureVideoDataOutputSampleBufferDelegate, AVCaptureAudioDataOutputSampleBufferDeleg.. 2019. 4. 16.
Ios autoLayout 기초 Ios autoLayout 기초 예제소스 #import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; //크기 고정 뷰 - 화면 정중앙에 배치될 정사각형의 뷰 만들기 UIView *oneView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)]; oneView.translatesAutoresizingMaskIntoConstraints = NO; //필수! [oneView setBackgroundColor:[UIColor brownColor]]; [self.view add.. 2019. 4. 5.
ios 화면보호기 & 터치 감지하기 ios 화면보호기 & 터치 감지하기 목표 iOS UIWindow에서 터치를 감지한 후 일정시간 터치가 없으면 화면보호기 viewcontroller 띄워주는 기능 구현 순서 *공통상수클래스 제작- CommonValues 설명: 화면보호기 시간을 설정해준다. #import @interface CommonValues : NSObject @property(nonatomic,assign) int SAVER_TIME; //화면보호기 시간 @end #import "CommonValues.h" @implementation CommonValues @synthesize SAVER_TIME; - (instancetype)init { self = [super init]; if (self) { SAVER_TIME = 3; //.. 2019. 4. 5.
날짜를 이용해서 파일 삭제하기 날짜를 이용해서 파일 삭제하기 날짜를 이용해서 30일이 지난 폴더 또는 파일을 삭제하는 기능을 구현해 보자. 먼저, 다큐먼트 폴더 안에 video, photo, audio 폴더가 각각있다고 가정하자. 위의 미디어 폴더 아래는 20190401, 20190402 와 같이 폴더 or 파일이름이 생성한 날짜인 파일들이 존재할 것이다. 참고로 다큐먼트 폴더는 사용자가 접근할 수 있는 최상위 폴더이다. 다큐먼트 이외의 폴더로는 애플 정책상(보안문제)접근이 어렵다. 필요한 데이터는 아래와 같다. 1.오늘날짜를 초를 변환한 값. 2.파일을 생성한 날짜를 초로 변환한 값 3.생성한 날짜에 30일(초값)을 더한 값. - 삭제예정일 (생성한 날짜를 초로 변환하고 30일을 초로 변환해서 계산 후 리턴 한다.) 위의 데이터를 .. 2019. 4. 3.
날짜계산(특정시간 이후 날짜 구하기) 날짜계산(특정시간 이후 날짜 구하기) 날짜와 시간을 위한 프로그래밍을 위해서는 기본적으로 NSDate를 사용한다. NSDate는 2001년 1월 1일 자정을 기준으로 현재시간(특정)까지의 경과한 시간(초)을 저장하고 있는 객체이다. 두 시점의 과거 , 미래 시간을 비교하는 작업은 가능하나, 구체적인 날짜나 요일을 구하기는 어렵다. (예 3월1일은 무슨요일인가 ?등) 날짜를 자유자재로 다룰려면 NSCalendar와 NSDateComponents 객체에 대해서 알아야 한다. NSDateComponents는 몇 월, 몇 일 등 날짜 정보를 구성하는 달력에서 기본 단위들에 대한 정보를 얻는데 사용된다. 실제로 NSDate 객체와 NSDateComponents 객체를 NSCalendar 객체가 연결해준다. *코드.. 2019. 4. 3.
uuid 구하기(ios 기기 고유번호) uuid 구하기(ios 기기 고유번호) 과거 iOS 기기의 고유 번호를 얻기 위해서 udid가 존재했었다. 하지만 개인정보 문제 등으로 ios5 부터는 udid가 사라지고 uuid(임의로 생성한 고유값)가 생겨났다. 애플도 uuid를 이용해서 기기 고유번호를 생성하라고 권고한다. 하지만 문제는 uuid도 앱을 삭제하면 새롭게 생성 된다. 즉 고유값이라고 할 수 없다. 개인정보 문제로 부터 자유로워졌긴 하지만, 개발자들이 이 고유번호를 다루기가 까다로워졌다. 여러 방법이 있겠지만 uuid를 최초로 생성하고 keychain에 저장시켜주는 방법 찾아보았다. /* File: KeychainItemWrapper.m Abstract: Objective-C wrapper for accessing a single ke.. 2019. 4. 2.
카메라 줌 AVCaptureDevice Zoom 카메라 줌 AVCaptureDevice Zoom 예전시간에 카메라 자동 회전 기능을 소개했다. https://abc1211.tistory.com/615 그곳에 카메라 줌기능을 넣기 위해서 이것저것 찾아보고 시도해보았다. 처음에는 카메라 캡쳐화면을 실시간으로 보여주는 PreviewLayer에 pinchegesture를 걸어서 제스쳐 변화 값을 이용해서 zoom해주면 된다고 생각했는데 거의 오전 내내 삽질을 했다. 결론은 previewlayer에는 gesture 를 걸 수 없다. Avcapturedevice 를 이용해야 한다. 아래는 해당 소스이다. 주석을 달아 놓았다. *제스쳐 함수 //self.view 에 pinches 제스쳐 이벤트를 걸었다. view 화면을 두 손가락으로 움직이면 AVCaptureDe.. 2019. 4. 2.
core audioqueue player 에 대하여 2(추가설명) core audioqueue player 에 대하여 2(추가설명) 지난번 글에서 오디오 큐로 오디오 플레이어를 구현하는 법을 포스팅 했다. 테스트를 하면서 확인해 본결과 오디오 파일을 읽을 때 읽을 패킷 값을 UInt32 numPackets = 10*1000; 이런식으로 고정값으로 해놓으니 런타임이 긴 오디오에서는 콜백을 타지 않는 현상이 발견했다. 그래서 DeriveBufferSize 함수를 만들어서 버퍼 사이즈와 한번에 읽을 패킷 수를 유동적으로 구하기로 했다. 또 지난번에 로그를 확인하는 시간을 안가졌다. 오디오 큐가 오디오 파일을 어떻게 읽는지, 그 읽은 값은 어떻게 되는지.또 오디오 파일을 읽은 후 오디오 큐가 콜백 함수를 어떻게 호출 하는지.. 콜백 함수 내부에서는 어떤일이 일어나는지 등등 로.. 2019. 3. 29.
core audioqueue player 에 대하여 core audioqueue player 에 대하여 코어오디오를 이용해서 음원을 플레이 하는 어플을 간단하게 만들어보았다. 애플 오디오 프로그래밍 가이드 문서를 기반으로 구현을 하였다. 작동 순서는 prepare 버튼을 눌러서 먼저 재생할 오디오 파일 형식, 파일 위치와 관련된 설정을 해준다. 그 후 start 버튼을 눌러서 음원을 재생한다. 재생을 하면 재생이 완료 될때까지 끊임없이 콜백함수가 호출되면서 오디오 파일에서 읽은 데이터를 버퍼에 넣고 출력한다. 그리고 음악이 종료되며면 dispose 버튼을 눌러서 메모리에 할당된 큐를 해제해준다. 처음에 이 프로세서를 알기까지 꽤 많은 시간이 걸렸다. 단순하게 오디오를 재생하려면 이미 만들어져있는 MediaPlayer 오디오 프레임워크를 가져다 쓰면된다. .. 2019. 3. 28.
core audio queue service (ios recording) core audio queue service 본글은 애플의 오디오큐서비스프로그래밍 가이드 문서를 참고해서 작성했습니다. 뷰 코드 //step 1. 라이브러리 임포트 #import #import #import #import #import //step1. 상태를 관리하기 위한 사용자정의 구조 static const int kNumberBuffers = 3; // 1 struct AQRecorderState { AudioStreamBasicDescription mDataFormat; // 2 . 오디오 데이터 포멧, mQueue에 사용된다. AudioQueueRef mQueue; // 3. 앱에 의해 생성되는 레코딩 오디오 큐 AudioQueueBufferRef mBuffers[kNumberBuffers]; .. 2019. 3. 26.
ios 카메라 화면 자동회전 (camera auto rotation) ios 카메라 화면 자동회전 (camera auto rotation) 코드 #import #import "ViewController.h" //화면 전체 가로, 세로길이 구하기#define kScreenWidth [UIScreen mainScreen].bounds.size.width#define kScreenHeight [UIScreen mainScreen].bounds.size.height //screen orientationbool g_isPortraitMode; //현재 세로냐 가로냐float _screenWidth_Landscape; // 가로일때 가로길이float _screenHeight_Landscape; //가로일때 세로길이float _screenWidth_Portrait; //세로일때 가로길.. 2019. 3. 8.
코어오디오 MediaPlayer 구현 MediaPlayer 구현 네비게이션 info.plist storyboard #import @interface ViewController : UIViewController @end //MediaPlayer 임포트!#import #import "ViewController.h" @interface ViewController () @property (strong,nonatomic) MPMediaPickerController *mpPickerVC; //픽커 컨트롤러@property (strong,nonatomic) MPMediaItemCollection *slctitems; //선택된 아이템@property (strong,nonatomic) MPMusicPlayerController *appMusicPlayer.. 2019. 3. 4.
엔터프라이즈 계정으로 배포 http://blog.saltfactory.net/distribute-ios-app-using-with-dropbox-without-server/ https://imhaba.tistory.com/41 복사한 링크 텍스트를 텍스트 에디터에 복붙 한다. 예 > https://www.dropbox.com/s/xbrrsqruajf27p0/apnsguide.ipa?dl=0 에디터를 통해서 www.dropbox.com 을 아래 텍스트로 치환하고 url 텍스트 끝의 ?dl=0 를 삭제한다. dl.dropboxusercontent.com 예> https://dl.dropboxusercontent.com/s/xbrrsqruajf27p0/apnsguide.ipa https://dl.dropboxusercontent.com.. 2019. 2. 15.
이미지 자르기 이미지 자르기 - (IBAction)CaptureAction:(id)sender { NSLog(@"캡쳐 버튼 눌렸습니다."); CGSize screenS = myImageView.frame.size; CGFloat delX = myImageView.image.size.width / screenS.width; CGFloat delY = myImageView.image.size.height / screenS.height; NSLog(@"myImageView.image.size.width : %f" ,myImageView.image.size.width ); NSLog(@"myImageView.image.size.height : %f" ,myImageView.image.size.height ); NSLog(@".. 2019. 1. 27.
UIpangesture로 UIView 옮기기& 특정 프레임 넘어가지 않게 설정 UIpangesture로 UIView 옮기기& 특정 프레임 넘어가지 않게 설정 소스 #import "ViewController.h" @interface ViewController (){ //사진틀 IBOutlet UIImageView *myImageView; //뷰파인더를 옮기기 전 위치 CGPoint beforPoint; //뷰파인더 UIView *viewFinder; //뷰파인더를 감싸고 있는 네 개의 점. UIView *leftTopPoint; UIView *rightTopPoint; UIView *leftDownPoint; UIView *rightDownPoint; UIBezierPath *blackPath; //검은색 블러 UIBezierPath *framePath; //포커스 CAShapeLa.. 2019. 1. 25.
일정시간이 지난 파일 자동 삭제하기 일정시간이 지난 파일 자동 삭제하기 앱실행할때 호출//일정 시간 지난 미디어 파일 지우기 [self deleteOverDateMediaFile]; //삭제 기준 날짜 가져오기 -(float)getDeleteStandardDateSeconds{ //기준이 되는 날짜 // 1. 3일 전 날짜를 구함 -> 데이터 포멧 변환 -> string으로 변환 -> 초 로변환 (568393200.000000) NSDateComponents* deltaComps = [[NSDateComponents alloc] init]; [deltaComps setDay: -3]; NSDate* tomorrow = [[NSCalendar currentCalendar] dateByAddingComponents:deltaComps toDa.. 2019. 1. 9.
날짜데이터를 문자로 변환 날짜데이터를 문자로 변환 //기준이 되는 날짜 // 1. 3일 전 날짜를 구함 -> 데이터 포멧 변환 -> string으로 변환 -> 초 로변환 (568393200.000000) NSDateComponents* deltaComps = [[NSDateComponents alloc] init]; [deltaComps setDay:-3]; NSDate* tomorrow = [[NSCalendar currentCalendar] dateByAddingComponents:deltaComps toDate:[NSDate date] options:0]; NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; dateFormatter.dateFormat = @".. 2019. 1. 9.
AppDelegate 사용자 터치 감지하기 AppDelegate 사용자 터치 감지하기 .h #import #import "SecurityViewController.h"@interface DetectTouchWindow : UIWindow@property (strong,nonatomic) NSTimer *idleTimer; //타이머@property (strong, nonatomic) UIWindow *window; @end .m #import "DetectTouchWindow.h" @implementation DetectTouchWindow@synthesize idleTimer; - (void)sendEvent:(UIEvent *)event { [super sendEvent:event]; // 타이머 재설정 횟수를 줄이기 위해 시작 터치 또는 종.. 2019. 1. 4.
최상위 viewController 클래스의 이름 가져오기 최상위 viewController 클래스의 이름 가져오기 //현재 띄워진 class 의 이름 UIViewController *curentViewController = [[[UIApplication sharedApplication] keyWindow] rootViewController]; NSString *currentSelectedCViewController = NSStringFromClass([[((UINavigationController *)curentViewController) visibleViewController] class]); 2019. 1. 4.
ios 오토레이아웃 코드로 응용하기 ios 오토레이아웃 코드로 응용하기 .m #import @interface AutoLayoutSampleViewController : UIViewController @end.h #import "AutoLayoutSampleViewController.h" @interface AutoLayoutSampleViewController () @property (nonatomic,strong) UILabel *bigTitle; //암호 입력 @property (nonatomic,strong) UILabel *smallTitle; //암호를 입력해주세요. @property (nonatomic,strong) UITextField *textfield; //텍스트 필드 @property (strong, nonatomic).. 2019. 1. 4.
ios auto_layout 오토레이아웃 코드 ios auto_layout 오토레이아웃 코드 #import "AutoLayoutSampleViewController.h" @interface AutoLayoutSampleViewController ()@property (nonatomic, strong) UIButton *leftButton;@property (nonatomic,strong) UIButton *rightButton;@property (nonatomic,strong) UITextField *textfield;@end @implementation AutoLayoutSampleViewController - (void)viewDidLoad { [super viewDidLoad]; UIView *superview = self.view; //1. .. 2019. 1. 3.
암호화 복호화 암호화 복호화 #import #import "RNDecryptor.h"#import "RNEncryptor.h" @interface ViewController : UIViewController{ NSString *secretKey; //salt}- (NSString *)getCryptorEncrypt:(NSString *)toEncryptString; //암호화 - (NSString *)getRNCryptorDecript:(NSString *)toDecriptDataString; //복호화 @end #import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [s.. 2019. 1. 2.
Obejctive c 클래스 변수 & 배열을 json 변환 Obejctive c 클래스 변수 & 배열을 json 변환 #선언 CaptureMediaActivity.h //임시 경로 저장된 최종 배열 리턴+ (NSMutableArray * ) tempMediaFilePathArray; //배열에 스트링 경로 저장하기+ (void) setTempMediaFilePathToArray:(NSString *)urlString; CaptureMediaActivity.m //공용 배열 변수 ,내부사용할 정적변수 생성static NSMutableArray * _tempFileUrlArray; - (void)viewDidLoad { [super viewDidLoad]; //배열 초기화_tempFileUrlArray = [[NSMutableArray alloc]init]; } /.. 2019. 1. 2.
UIView 커스터마이징 & 오디오 비디오 사진 뷰어 uiview 커스터마이징 & 오디오 비디오 사진 뷰어 .h #import #import #import @interface MediaViewActivity : UIViewController @end .m #import "MediaViewActivity.h" @interface MediaViewActivity ()@property (strong, nonatomic) MPMoviePlayerController *moviePlayer;@property (strong, nonatomic) AVAudioPlayer *audioPlayer;@property (nonatomic, assign) BOOL isPlaying;@property(strong,nonatomic) NSTimer *TimeOfActiveUser;@.. 2018. 12. 28.
ios 저장 용량 계산 ios 저장 용량 계산 # pragma about Storage Method //전체 저장 용량-(uint64_t)getTotalDisk { uint64_t totalSpace = 0; NSError *error = nil; NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSDictionary *dictionary = [[NSFileManager defaultManager] attributesOfFileSystemForPath:[paths lastObject] error: &error]; if (dictionary) { NSNumber *fileSystemSizeInBytes .. 2018. 12. 27.
ios 오디오 + 비디오 권한 체크 함수 ios 오디오 + 비디오 권한 체크 함수 .h #import #import @interface PermissionsManager : NSObject //음성녹음 권한체크-(void)checkMicrophonePermissionsWithBlock :(void(^)(BOOL granted))block; //카메라 권한 상태 체크-(void)checkCameraAuthorizationsStatusWithBlock :(void(^)(BOOL granted))block; @end .m #import "PermissionsManager.h" #import @implementation PermissionsManager //오디오 권한 체크 - (void)checkMicrophonePermissionsWithBlock.. 2018. 12. 20.
FileManager FileManager .h #import @interface FileManager : NSObject //임시파일 저장 URL-(NSURL*) tempFileURL; //삭제할 파일이 있는 URL-(void) removeFile:(NSURL *) outputFileURL; //복사할 문서가 있는 위치 URL 넣고 그곳으로 복사-(void)copyFileToDocuments:(NSURL *)fileURL; //카메라롤에 복사-(void)copyFileToCameraRoll:(NSURL *)fileURL; @end .m #import "FileManager.h" #import @implementation FileManager //현재 파일 위치 - (NSURL *)tempFileURL{ NSLog(@"Fil.. 2018. 12. 20.
audiosessionQueue play - 코어오디오 재생하기 audiosessionQueue play .h #import #import #import #import #import @interface CoreAudioPlayViewController : UIViewController enum { kNumberBuffers = 3, //오디오 버퍼는 3개 kNumberPackages = 10* 1000, //한번에 읽는 패키지 개수}; struct PlayerStat{ AudioStreamBasicDescription mDataFormat; //오디오 스트림의 광범위한 특성정의 AudioQueueRef mQueue; // 재생오디오큐 AudioQueueBufferRef mBuffers[kNumberBuffers]; //오디오 큐 버퍼 포인트의 리스트 AudioFile.. 2018. 12. 19.
ios audiosessionqueue 파일 재생 시간 구하는 두가지 방법 ios audiosessionqueue 파일 재생 시간 구하기 1. avfoundation api 이용 AVURLAsset* audioAsset = [AVURLAsset URLAssetWithURL:url2 options:nil]; CMTime audioDuration = audioAsset.duration; float audioDurationSeconds = CMTimeGetSeconds(audioDuration); NSLog(@"파일 재생 시간 audioDurationSeconds : %f " ,audioDurationSeconds); 2.audiofilegetproperty 이용 //파일 전체 재생시간 구하기 Float64 outDataSize = 0; UInt32 thePropSize = size.. 2018. 12. 19.