본문 바로가기

Study/C#

Media APIs

미디어 관련 API에는 크게 두가지가 있습니다.

CameraCaptureUI 와 Media capture 입니다.

CameraCaptureUI는 간단한 사용과 동시에 편집이 가능한 API입니다.

반면 Media capture는 동영상과 음성녹화등의 기능이 주된 API입니다.

상황에 맞게 사용하면 될 것입니다.

( 두 API는 메니페스트에서 웹캠과 마이크에 사용권한을 줘야 합니다. )

 

 - CameraCaptureUI

단순 카메라와 동영상의 녹화와 동시에 편집을 도와주는 API입니다.

 

CameraCaptureUI Sample.zip

dev.windows.com 에 올라온 예제 샘플입니다.

실행시켜 보면 카메라의 사용여부를 묻는 메시지창이 뜨고

확인을 누르면 캠을 통해서 화면이 뜨게 됩니다.

CameraCaptureUI는 따로 사진버튼이 있는 것이 아니라 화면의 터치를 통해

사진을 찍습니다. 화면을 터치하여 사진을 찍었다면 사진 자르기 툴이 뜨게되고

해당 툴을 통해 원하는 크기로 편집을 하여 사용하면 됩니다.

이 API는 크게 어렵운 것이 없기 때문에 이 정도로 정리해 두겠습니다.

 

 

- Media capture

이 API는 사진보다는 동영상에 특화 된 API입니다.

CameraCaptureUI가 사진을 찍어 저장을 한다면 Media capture은 동영상과

음원을 저장하는 API입니다.

 

Media capture using capture device sample.zip

dev.windows.com에 올라온 예제 샘플입니다.

이 예제에는 사진과 동영상, 음원 녹음 3가지의 기능이 있는데

저의 노트북에서는 사진 촬영시 검은 화면만 저장이 되는 관계로

사진에 관한 기능은 뺴고 설명하도록 하겠습니다.

( 어렵지 않고 동영상과 사용법은 거의 같아서 사용하기 어렵진 않습니다. )

 

1.

fileName = DateTime.Today.Year.ToString() + DateTime.Today.Month.ToString() + DateTime.Today.Day.ToString() +".wmv";

 

저장할 파일명을 만들어 줍니다.

저는 녹음(녹화)한 날짜를 제목으로 달아주기 위해서 위 같이 만들었고

마지막에 ".wmv"는 동영상 녹화를 위한 확장자를 지정해 준 것 입니다.

".mp3"; 로 바꾸어 준다면 음원파일로 녹음이 됩니다.

 

2. 파일 저장 위치 & 파일 저장 폴더

 

// 음악공유폴더에 Reco의 경로를 가져오는 부분
StorageFolder saveFolder = await KnownFolders.MusicLibrary.GetFolderAsync("Reco");
                                     
if (saveFolder == null)
{
     // 폴더가 없다면 생성
     saveFolder = await KnownFolders.MusicLibrary.CreateFolderAsync("Reco");
}

 

일단 윈도우8에서는 윈도우7과는 다르게 파일을 저장 할 수 있는 곳이 제한적입니다.

윈8은 공유폴더 안에 있는 내사진, 내비디오 등의 폴더와 앱 자체의 저장소만 이용 할 수 있습니다. KnownFolders는 말 그래도 알려진 폴더, 즉 내 문서나 내사진, 내 비디오처럼

공개된 공용라이브러리에 접근을 할 수 있는 객체입니다.

KnownFolders안에는 내 음악과 내 사진등의 폴더가 들어있고

한 번더 안으로 들어가면 그 폴더 내에서 할 수있는 기능들이 들어있습니다.

 

위의 소스는 처음 제가 시도했던 알고리즘입니다.

해당 폴더에 Reco라는 폴더를 검색하고 이 폴더가 없어서 Null값을 반환하면

이 Null값을 판별해서 폴더를 새로 생성하던가 기존 폴더를 가져오려는 시도였습니다.

 

하지만 생각과 다르게 GetFolderAsync()함수는 폴더가 없으면 Null값의 반환이 아니라

바로 에러를 던지고, 바로 catch문으로 빠져버리는 문제가 있었습니다.

 

하지만 이런 머리아픈 알고리즘을 짤 필요가 없었는데요 ㅡㅅㅡ;;

이유는 바로 CreateFolderAsync() 함수에 숨어있습니다.

CreateFolderAsync()함수는 말 그래로 폴더를 만드는 함수입니다.

위 소스처럼 CreateFolderAsync("Reco");이라고 주면 해당 위치에 Reco라는 폴더를 생성합니다. 하지만 이대로 사용하면 해당 폴더가 있어서 재생성을 하면서 덮어쓰기 해 버린다는

문제가 발생합니다. 그래서 CreateFolderAsync()함수에서는 CreateFolderAsync(폴더명)와

동시에 CreateFolderAsync(폴더명, 해당 폴더명이 존재 할 시 실행할 동작);이런 오버로드를

제공하고 있습니다.

CreationCollisionOption 옵션을 통해 존재할 시 원하는 동작을 설정해줍니다.

 

StorageFolder saveFolder = await KnownFolders.MusicLibrary.CreateFolderAsync("Reco", CreationCollisionOption.OpenIfExists);

 

제가 사용한 방법입니다.

내 음악 폴더엔에 Reco라는 폴더를 생성하고, 만약 이 폴더가 존재한다면 CreationCollisionOption 을 통해 해당 주소를 반환하는 구문입니다.

saveFolder는 새로 생성된 폴더이든 기존에 있는 폴더이든 Reco의 폴더를 가져오게 됩니다.

 

CreateFolderAsync() 와 마찬가지로 CreateFileAsync()도 존재하는데

CreateFolderAsync()가 폴더에 관한 함수라면 CreateFileAsync()는 파일에 관한 합수입니다.

사용법은 동일합니다.

단 위에서 해당 폴더(파일)명이 존재할 시 수행 할 동작을 지정해주는 CreationCollisionOption

옵션을 잘 사용해야 합니다.

 

FailIfExists : 해당 폴더(파일)가 있을 시 오류를 반환합니다.

GenerateUniqueName : 해당 폴더(파일)가 있을 시 이름 뒤에 숫자를 붙여 생성합니다. 

OpenIfExists : 해당 폴더(파일)가 있을 시 기존의 폴더(파일)를 반환합니다.

ReplaceExisting : 해당 폴더(파일)가 있을 시 해당 이름으로 변경합니다

 

여기까지가 녹음(녹화)를 할 파일의 저장위치와 이름을 설정하는 부분입니다.

 

3. 파일 설정하기

MediaEncodingProfile.CreateWmv(Windows.Media.MediaProperties.VideoEncodingQuality.Auto);

 

MediaEncodingProfile이라는 클래스 안에 다양한 인코딩 옵션이 있습니다.

mp3와 mp4, wma와 wmv 의 인코딩 옵션중에 원하는 설정을 하고 ()안에 해당 컨텐츠의

퀄리티 옵션을 설정합니다. 위의 예제처럼 마지막에 VideoEncodingQuality

혹은 AudioEncodingQuality 위에 원하는 퀄리티의 설정을 해주면 됩니다.

 

4. 녹음을 시작하자

m_mediaCaptureMgr.StartRecordToStorageFileAsync(recordProfile, this.m_recordStorageFile);

 

MediaCapture 형식인 m_mediaCaptureMgr 안에 StartRecordToStorageFileAsync() 함수를

통해 레코딩을 시작합니다. ()안에는 설정과 저장관련 설정을 넣어줍니다.

( 반대로 레코딩을 끝낼 떄는 해당 지점에  StopRecordToStorageFileAsync()를 호출합니다.)

 

 

이렇게 두 미디어의 API를 통해 미디어를 다루면 되겠습니다.
                   

 

 

 

 

'Study > C#' 카테고리의 다른 글

MVVMlight  (0) 2012.10.07
LINQ ( 링크 )  (0) 2012.10.07
Code Snippets  (0) 2012.10.06
12. 09. 22  (0) 2012.09.22
12. 09. 22  (0) 2012.09.22