반응형
블로그 이미지
개발자로서 현장에서 일하면서 새로 접하는 기술들이나 알게된 정보 등을 정리하기 위한 블로그입니다. 운 좋게 미국에서 큰 회사들의 프로젝트에서 컬설턴트로 일하고 있어서 새로운 기술들을 접할 기회가 많이 있습니다. 미국의 IT 프로젝트에서 사용되는 툴들에 대해 많은 분들과 정보를 공유하고 싶습니다.
솔웅

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

카테고리

오디오, 비디오, 사진 컨트롤 1

2011. 10. 19. 23:18 | Posted by 솔웅


반응형
이제 오디오, 비디오, 사진 컨트롤을 코로나에서는 어떻게 하는지 공부하겠습니다.
첫번째로 오디오에 대해서 알아보겠습니다.

안드로이드 앱을 만들어 보신 분들은 아시겠지만 안드로이드에서는 이미지나 오디오 파일, xml 파일을 인식할 때 확장자는 고려하지 않습니다.
그러니까 aaa.png나 aaa.gif 나 aaa.jpg 이렇게 확장자만 다르고 이름이 같은 파일들은 동일하게 인식을 합니다. (결국엔 에러를 일으키게 됩니다.)
오디오도 마찬가지 인데요. aac, aif, caf, mp3, ogg 등이 오디오에서 사용하는 확장자 인가봅니다. 이름을 정할 때 확장자를 제외한 파일 이름이 유니크 하도록 정해야 합니다.

코로나에서 오디오를 다룰 때 사용하는 채널의 맥시멈은 32 입니다.
그러니까 동시에 32 channel 까지 사용할 수 있습니다.
audio.totalChannels 를 통해서 채널 갯수를 알 수 있습니다.

사운드(sound) 를 load하는 방법은 두가지가 있습니다.
loadSound()와 loadStream() 입니다.
첫번째는 사운드 파일을 모두 메모리에 올려 놓는 것이고 두번째는 play 할 때 스트리밍 하면서 플레이 하는 것입니다.
첫번째는 시간상으로 절약이 되는 대신에 메모리를 많이 차지하겠고 두번째는 시간이 지연될 수는 있지만 메모리를 아낄 수 있겠죠?

위 파일을 받아보세요.
제가 스나이퍼의 총소리를 좋아하는데 그거 비슷한 소리 같아서 자주 이용해요.
그리고 main.lua에 아래 코드를 넣어보세요.
 explosionSound = audio.loadSound("explosion6.wav")
  audio.play(explosionSound)
  audio.play(explosionSound)
  audio.play(explosionSound)
  audio.play(explosionSound)
  audio.play(explosionSound)

audio.play를 한개만 했을 때와 위와 같이 여러개 했을 때와 비교해 보세요.
위와 같이 loadSound로 불러들이면 메모리에 사운드를 로딩해 놓고 있는 상황이기 때문에 동시에 사운드를 들려줍니다.
audio.loadSound 를 audio.loadStream으로 바꾸면 어떻게 될까요?
이 경우엔 audio.play 하면서 파일을 메모리로 일부분씩 불러들이고 (streaming 하고) 소리를 내기때문에 1개의 소리만 들립니다.

loadStream을 하면서 동시에 소리를 내고 싶으면 아래와 같이 해야 됩니다.
explosionSound1 = audio.loadStream("explosion6.wav")
explosionSound2 = audio.loadStream("explosion6.wav")
explosionSound3 = audio.loadStream("explosion6.wav")
explosionSound4 = audio.loadStream("explosion6.wav")
explosionSound5 = audio.loadStream("explosion6.wav")
  audio.play(explosionSound1)
  audio.play(explosionSound2)
  audio.play(explosionSound3)
  audio.play(explosionSound4)
  audio.play(explosionSound5)

이렇게 하니까 동시에 소리가 나네요.

loadSound로 불러들이면 미리 메모리에 올려놓은 상태이기 때문에 즉시 소리를 play할 수 있습니다. 반면에 loadStream을 사용하면 첫번째 chunk를 메모리로 불러들이는데 시간이 좀 걸릴 수 있습니다.

audio.play를 다 하고 메모리를 비우려면 audio.dispose() 함수를 사용해야 합니다.
물론 해당 오디오 파일이 프로그램 끝날 때 까지 계속 사용해야 되면 이 함수를 사용할 일은 없겠지만요. 당연히 프로그램이 종료 될 때 모든 메모리는 릴리즈 됩니다.

audio.dispose()를 확실하게 사용하려면 아래와 같이 하시면 됩니다.
laserSound = audio.loadSound( "laserSound.wav" )
backgroundMusic = audio.loadStream( "backgroundMusic.m4a" )
audio.dispose( laserSound )
audio.dispose( backgroundMusic )
laserSound = nil  -- This makes sure we can't use the handle again
backgroundMusic = nil  -- This makes sure we can't use the handle again

저 사운드를 게임의 스테이지 1에서만 사용하고 그 위 단계에서는 사용하지 않는다면 저렇게 메모리에서 완전히 사라지게 하는것도 좋은 방법이겠죠? 메모리 관리와 퍼포먼스 차원에서요......

audioPlayFrequency를 설정할 수도 있습니다.

config.lua 파일에 아래와 같이 audioPlayFrequency를 설정합니다.
  application =
  {
      content =
      {
          width = 320,
          height = 480,
          scale = "letterbox",
          audioPlayFrequency = 22050
      },
  }
22050Hz이상이 필요하지 않으면 위와 같이 하면 됩니다. 이것보다 높은 Hz가 필요하다면 44100으로 세팅을 하시구요.
코로나에서 제공되는 값은 11025,22050,44100Hz라고 합니다. 그 이외의 것들은 아직 테스트를 해보지 못했다고 하네요.

stereo가 아니라 mono sound를 사용하게 되면 메모리 점유 공간을 반으로 줄일 수 있습니다. 코로나에서는 OpenAL을 사용한다고 하는데요. OpenAL은 mono sound에 대해서 spatialized/3D effects를 제공한다고 합니다. 하지만 스테레오에는 이 3D효과를 제공하지 않는다네요. 오디오 쪽은 제가 잘 몰라서 이 3D 효과가 뭔지는 모르겠습니다. (돌비 서라운드 시스템 지원을 말하나???) 하여간 코로나에서는 아직까지 이 3D 효과는 지원하지 않고 있답니다.

audio.reserveChannels()
오디오를 로딩하고 플레이를 하면 코로나는 자동적으로 특정 채널에 이 오디오를 할당하게 됩니다.
그런데 이 채널에 볼륨이라던지 다른 세팅이 돼 있다면 그리고 1번 오디오를 플레이하고 2,3,4 번이 다른 채널에서 플레이 되다가 5번채널을 플레이 했는데 이것이 1번 오디오를 플레이했던 채널이랑 동일한 채널에 할당 된다면.
미리 그 채널에 맞춰놨던 세팅값이 5번 사운드에도 적용이 될 겁니다.

이런 부분 까지 제어 해야 될 필요성이 있다면 이 함수를 씁니다.
audio.reserveChannels(2) 이런식으로요. 그러면 해당 채널은 자동 할당이 안 되겠죠.

그리고 audio.findFreeChannel()함수도 있는데요.
이것은 해당 채널부터 할당할 채널을 검색하게하는 함수입니다.

local availableChannel = audio.findFreeChannel()
audio.play( laserSound, { channel=availableChannel } )

이렇게 하면 이 가능한 채널보다 높은 숫자의 채널들을 검색해서 할당하게 될 겁니다.

이상 코로나에서의 사운드 컨트롤에 대해서 알아보았습니다.
다음 시간엔 비디오, 카메라, 사진 라이브러리에 대해서 알아보겠습니다.

그리고 이런 미디어를 다룰 때 유용하게 사용할 수 있는 함수들을 알아보겠습니다.
예를 들어 반복 실행, 딜레이, Completion Listener 로 완료 후 어떤 동작 할 수 있도록 하기, 원래 실행 시간보다 길게 실행 되도록 하기, 잠깐 멈추기, 볼륨 조절 등등이요.

그럼 다음에 뵙겠습니다.




반응형