다음을 통해 공유


Android 오디오

Android OS는 오디오와 비디오를 모두 포함하는 멀티미디어에 대한 광범위한 지원을 제공합니다. 이 가이드에서는 Android의 오디오에 중점을 두고 기본 제공 오디오 플레이어 및 레코더 클래스와 하위 수준 오디오 API를 사용하여 오디오 재생 및 녹음을 다룹니다. 또한 개발자가 잘 작동하는 애플리케이션을 빌드할 수 있도록 다른 애플리케이션에서 브로드캐스트하는 오디오 이벤트 작업을 다룹니다.

개요

최신 모바일 장치는 이전에는 카메라, 음악 플레이어 및 비디오 레코더와 같은 전용 장비가 필요했던 기능을 채택했습니다. 이 때문에 멀티미디어 프레임워크는 모바일 API에서 일류 기능이 되었습니다.

Android는 멀티미디어에 대한 광범위한 지원을 제공합니다. 이 문서에서는 Android에서 오디오 작업을 검토하고 다음 항목을 다룹니다.

  1. MediaPlayer 로 오디오 재생 – 기본 제공 MediaPlayer 클래스를 사용하여 로컬 오디오 파일 및 클래스와 스트리밍된 오디오 파일을 포함하여 오디오를 AudioTrack 재생합니다.

  2. 오디오 녹음 - 기본 제공 MediaRecorder 클래스를 사용하여 오디오를 녹음합니다.

  3. 오디오 알림 작업 – 오디오 알림을 사용하여 오디오 출력을 일시 중단하거나 취소하여 이벤트(예: 수신 전화 통화)에 올바르게 응답하는 잘 작동하는 애플리케이션을 만듭니다.

  4. 하위 수준 오디오 작업 – 메모리 버퍼에 AudioTrack 직접 작성하여 클래스를 사용하여 오디오 재생 클래스를 사용하여 오디오를 AudioRecord 녹음하고 메모리 버퍼에서 직접 읽습니다.

요구 사항

이 가이드에는 Android 2.0(API 수준 5) 이상이 필요합니다. Android의 디버깅 오디오는 디바이스에서 수행해야 합니다.

AndroidManifest.XML 권한을 요청 RECORD_AUDIO 해야 합니다.

RECORD_AUDIO 사용하도록 설정된 Android 매니페스트의 필수 권한 섹션

MediaPlayer 클래스를 사용하여 오디오 재생

Android에서 오디오를 재생하는 가장 간단한 방법은 기본 제공 MediaPlayer 클래스입니다. MediaPlayer 는 파일 경로를 전달하여 로컬 또는 원격 파일을 재생할 수 있습니다. 그러나 MediaPlayer 매우 중요한 상태이며 잘못된 상태에서 해당 메서드 중 하나를 호출하면 예외가 throw됩니다. 오류를 방지하려면 아래에 설명된 순서대로 상호 작용하는 MediaPlayer 것이 중요합니다.

초기화 및 재생

오디오를 MediaPlayer 재생하려면 다음 시퀀스가 필요합니다.

  1. MediaPlayer 개체를 인스턴스화합니다.

  2. SetDataSource 메서드를 통해 재생할 파일을 구성합니다.

  3. Prepare 메서드를 호출하여 플레이어를 초기화합니다.

  4. Start 메서드를 호출하여 오디오 재생을 시작합니다.

아래 코드 샘플에서는 이 사용량을 보여 줍니다.

protected MediaPlayer player;
public void StartPlayer(String  filePath)
{
  if (player == null) {
    player = new MediaPlayer();
  } else {
    player.Reset();
    player.SetDataSource(filePath);
    player.Prepare();
    player.Start();
  }
}

재생 일시 중단 및 다시 시작

Pause 메서드를 호출하여 재생을 일시 중단할 수 있습니다.

player.Pause();

일시 중지된 재생을 다시 시작하려면 Start 메서드를 호출합니다. 그러면 재생의 일시 중지된 위치에서 다시 시작됩니다.

player.Start();

플레이어에서 Stop 메서드를 호출하면 진행 중인 재생이 종료됩니다.

player.Stop();

플레이어가 더 이상 필요하지 않은 경우 Release 메서드를 호출하여 리소스를 해제해야 합니다.

player.Release();

MediaRecorder 클래스를 사용하여 오디오 녹음

Android에서 오디오를 녹음하기 MediaPlayer 위한 순서는 MediaRecorder 클래스입니다. 상태 구분 MediaPlayer과 마찬가지로 여러 상태를 전환하여 기록을 시작할 수 있는 지점으로 전환합니다. 오디오 RECORD_AUDIO 를 녹음하려면 사용 권한을 설정해야 합니다. 애플리케이션 사용 권한을 설정하는 방법에 대한 지침은 AndroidManifest.xml 작업을 참조하세요.

초기화 및 기록

오디오를 MediaRecorder 녹음하려면 다음 단계가 필요합니다.

  1. MediaRecorder 개체를 인스턴스화합니다.

  2. SetAudioSource 메서드를 통해 오디오 입력을 캡처하는 데 사용할 하드웨어 디바이스를 지정합니다.

  3. SetOutputFormat 메서드를 사용하여 출력 파일 오디오 형식을 설정합니다. 지원되는 오디오 형식 목록은 Android 지원 미디어 형식을 참조 하세요.

  4. SetAudioEncoder 메서드를 호출하여 오디오 인코딩 유형을 설정합니다.

  5. SetOutputFile 메서드를 호출하여 오디오 데이터가 기록되는 출력 파일의 이름을 지정합니다.

  6. Prepare 메서드를 호출하여 레코더를 초기화합니다.

  7. Start 메서드를 호출하여 녹음/녹화를 시작합니다.

다음 코드 샘플에서는 이 시퀀스를 보여 줍니다.

protected MediaRecorder recorder;
void RecordAudio (String filePath)
{
  try {
    if (File.Exists (filePath)) {
      File.Delete (filePath);
    }
    if (recorder == null) {
      recorder = new MediaRecorder (); // Initial state.
    } else {
      recorder.Reset ();
      recorder.SetAudioSource (AudioSource.Mic);
      recorder.SetOutputFormat (OutputFormat.ThreeGpp);
      recorder.SetAudioEncoder (AudioEncoder.AmrNb);
      // Initialized state.
      recorder.SetOutputFile (filePath);
      // DataSourceConfigured state.
      recorder.Prepare (); // Prepared state
      recorder.Start (); // Recording state.
    }
  } catch (Exception ex) {
    Console.Out.WriteLine( ex.StackTrace);
  }
}

기록 중지

기록을 중지하려면 다음에서 메서드를 Stop 호출합니다 MediaRecorder.

recorder.Stop();

정리

MediaRecorder 중지되면 Reset 메서드를 호출하여 다시 유휴 상태로 전환합니다.

recorder.Reset();

MediaRecorder 더 이상 필요하지 않은 경우 Release 메서드를 호출하여 해당 리소스를 해제해야 합니다.

recorder.Release();

오디오 알림 관리

AudioManager 클래스

AudioManager 클래스는 오디오 이벤트가 발생할 때 애플리케이션에 알릴 수 있는 오디오 알림에 대한 액세스를 제공합니다. 이 서비스는 볼륨 및 벨소리 모드 컨트롤과 같은 다른 오디오 기능에 대한 액세스도 제공합니다. 애플리케이션에서 AudioManager 오디오 알림을 처리하여 오디오 재생을 제어할 수 있습니다.

오디오 포커스 관리

디바이스의 오디오 리소스(기본 제공 플레이어 및 레코더)는 실행 중인 모든 애플리케이션에서 공유됩니다.

개념적으로 이것은 하나의 응용 프로그램만 키보드 포커스가 있는 데스크톱 컴퓨터의 애플리케이션과 비슷합니다. 마우스로 클릭하여 실행 중인 애플리케이션 중 하나를 선택한 후에는 키보드 입력이 해당 애플리케이션으로만 이동합니다.

오디오 포커스는 유사한 아이디어이며 둘 이상의 애플리케이션이 동시에 오디오를 재생하거나 녹음하지 못하게 합니다. 키보드 포커스는 자발적이기 때문에 키보드 포커스보다 더 복잡합니다. 애플리케이션은 현재 오디오 포커스가 없고 오디오 포커스가 없다는 사실을 무시할 수 있으며 요청될 수 있는 오디오 포커스 유형이 다르기 때문입니다. 예를 들어 요청자가 매우 짧은 시간 동안만 오디오를 재생해야 하는 경우 일시적인 포커스를 요청할 수 있습니다.

오디오 포커스는 즉시 부여되거나 처음에는 거부되고 나중에 부여될 수 있습니다. 예를 들어 응용 프로그램이 전화 통화 중에 오디오 포커스를 요청하는 경우 거부되지만 전화 통화가 완료되면 포커스가 부여될 수 있습니다. 이 경우 오디오 포커스를 제거하면 그에 따라 응답하기 위해 수신기가 등록됩니다. 오디오 포커스를 요청하는 것은 오디오를 재생하거나 녹음해도 괜찮은지 여부를 결정하는 데 사용됩니다.

오디오 포커스에 대한 자세한 내용은 오디오 포커스 관리를 참조하세요.

오디오 포커스에 대한 콜백 등록

콜백 IOnAudioChangeListenerFocusChangeListener 등록하는 것은 오디오 포커스를 가져오고 해제하는 데 중요한 부분입니다. 오디오 포커스 부여가 나중에 지연될 수 있기 때문입니다. 예를 들어, 진행 중인 전화 통화가 있는 동안 애플리케이션에서 음악 재생을 요청할 수 있습니다. 전화 통화가 완료될 때까지 오디오 포커스가 부여되지 않습니다.

이러한 이유로 콜백 개체는 매개 변수로 메서드에 GetAudioFocusAudioManager전달되며 콜백을 등록하는 호출입니다. 오디오 포커스가 처음에 거부되었지만 나중에 부여된 경우 콜백을 호출하여 OnAudioFocusChange 애플리케이션에 알릴 수 있습니다. 동일한 메서드를 사용하여 오디오 포커스가 제거되고 있음을 애플리케이션에 알릴 수 있습니다.

애플리케이션이 오디오 리소스 사용을 완료하면 해당 메서드AudioManagerAbandonFocus 호출하고 콜백을 다시 전달합니다. 이렇게 하면 콜백이 등록 취소되고 오디오 리소스가 해제되므로 다른 애플리케이션에서 오디오 포커스를 얻을 수 있습니다.

오디오 포커스 요청

디바이스의 오디오 리소스를 요청하는 데 필요한 단계는 다음과 같습니다.

  1. 시스템 서비스에 대한 핸들을 AudioManager 가져옵니다.

  2. 콜백 클래스의 인스턴스를 만듭니다.

  3. 에서 메서드를 호출 RequestAudioFocus 하여 디바이스의 오디오 리소스를 AudioManager 요청합니다. 매개 변수는 콜백 개체, 스트림 유형(음악, 음성 통화, 링 등) 및 요청되는 액세스 권한의 유형입니다(오디오 리소스는 순간적으로 또는 무기한 요청될 수 있습니다.).

  4. 요청이 부여되면 메서드가 playMusic 즉시 호출되고 오디오가 재생되기 시작합니다.

  5. 요청이 거부되면 추가 작업이 수행되지 않습니다. 이 경우 오디오는 나중에 요청이 부여된 경우에만 재생됩니다.

아래 코드 샘플은 다음 단계를 보여줍니다.

Boolean RequestAudioResources(INotificationReceiver parent)
{
  AudioManager audioMan = (AudioManager) GetSystemService(Context.AudioService);
  AudioManager.IOnAudioFocusChangeListener listener  = new MyAudioListener(this);
  var ret = audioMan.RequestAudioFocus (listener, Stream.Music, AudioFocus.Gain );
  if (ret == AudioFocusRequest.Granted) {
    playMusic();
    return (true);
  } else if (ret == AudioFocusRequest.Failed) {
    return (false);
  }
  return (false);
}

오디오 포커스 해제

트랙 재생이 완료되면 메서드 AudioManagerAbandonFocus 호출됩니다. 이렇게 하면 다른 애플리케이션이 디바이스의 오디오 리소스를 얻을 수 있습니다. 다른 애플리케이션은 자체 수신기를 등록한 경우 이 오디오 포커스 변경에 대한 알림을 받게 됩니다.

낮은 수준의 오디오 API

낮은 수준의 오디오 API는 파일 URI를 사용하는 대신 메모리 버퍼와 직접 상호 작용하기 때문에 오디오 재생 및 녹음을 보다 잘 제어할 수 있습니다. 이 방법이 바람직한 몇 가지 시나리오가 있습니다. 이 시나리오에는 다음이 포함됩니다.

  1. 암호화된 오디오 파일에서 재생할 때

  2. 짧은 클립의 연속을 재생할 때.

  3. 오디오 스트리밍.

AudioTrack 클래스

AudioTrack 클래스는 녹음에 하위 수준 오디오 API를 사용하며 클래스와 동일한 MediaPlayer 하위 수준입니다.

초기화 및 재생

오디오를 재생하려면 새 인스턴스를 AudioTrack 인스턴스화해야 합니다. 생성자에 전달된 인수 목록은 버퍼에 포함된 오디오 샘플을 재생하는 방법을 지정합니다. 인수는 다음과 같습니다.

  1. 스트림 유형 – 음성, 벨소리, 음악, 시스템 또는 알람.

  2. 빈도 – Hz로 표현된 샘플링 속도입니다.

  3. 채널 구성 – 모노 또는 스테레오.

  4. 오디오 형식 – 8비트 또는 16비트 인코딩.

  5. 버퍼 크기(바이트)입니다.

  6. 버퍼 모드 – 스트리밍 또는 정적.

생성 후 Play 메서드 AudioTrack 가 호출되어 재생을 시작하도록 설정합니다. 오디오 버퍼를 작성하면 AudioTrack 재생이 시작됩니다.

void PlayAudioTrack(byte[] audioBuffer)
{
  AudioTrack audioTrack = new AudioTrack(
    // Stream type
    Stream.Music,
    // Frequency
    11025,
    // Mono or stereo
    ChannelOut.Mono,
    // Audio encoding
    Android.Media.Encoding.Pcm16bit,
    // Length of the audio clip.
    audioBuffer.Length,
    // Mode. Stream or static.
    AudioTrackMode.Stream);

    audioTrack.Play();
    audioTrack.Write(audioBuffer, 0, audioBuffer.Length);
}

재생 일시 중지 및 중지

Pause 메서드를 호출하여 재생을 일시 중지합니다.

audioTrack.Pause();

Stop 메서드를 호출하면 재생이 영구적으로 종료됩니다.

audioTrack.Stop();

정리

AudioTrack 더 이상 필요하지 않은 경우 릴리스를 호출하여 해당 리소스를 해제해야 합니다.

audioTrack.Release();

AudioRecord 클래스

AudioRecord 클래스는 녹음/녹화 쪽과 동일합니다AudioTrack. 마찬가지로 AudioTrack파일 및 URI 대신 메모리 버퍼를 직접 사용합니다. 매니페스트에서 RECORD_AUDIO 사용 권한을 설정해야 합니다.

초기화 및 기록

첫 번째 단계는 새 AudioRecord 개체를 생성하는 것입니다. 생성자에 전달된 인수 목록은 기록에 필요한 모든 정보를 제공합니다. AudioTrack인수가 주로 열거형인 경우와 달리 해당하는 인수 AudioRecord 는 정수입니다. 여기에는 다음이 포함됩니다.

  1. 마이크와 같은 하드웨어 오디오 입력 소스입니다.

  2. 스트림 유형 – 음성, 벨소리, 음악, 시스템 또는 알람.

  3. 빈도 – Hz로 표현된 샘플링 속도입니다.

  4. 채널 구성 – 모노 또는 스테레오.

  5. 오디오 형식 – 8비트 또는 16비트 인코딩.

  6. 버퍼 크기-바이트

AudioRecord 생성되면 StartRecording 메서드가 호출됩니다. 이제 녹음을 시작할 준비가 되었습니다. 입력 AudioRecord 을 위해 오디오 버퍼를 계속 읽고 이 입력을 오디오 파일에 씁니다.

void RecordAudio()
{
  byte[] audioBuffer = new byte[100000];
  var audRecorder = new AudioRecord(
    // Hardware source of recording.
    AudioSource.Mic,
    // Frequency
    11025,
    // Mono or stereo
    ChannelIn.Mono,
    // Audio encoding
    Android.Media.Encoding.Pcm16bit,
    // Length of the audio clip.
    audioBuffer.Length
  );
  audRecorder.StartRecording();
  while (true) {
    try
    {
      // Keep reading the buffer while there is audio input.
      audRecorder.Read(audioBuffer, 0, audioBuffer.Length);
      // Write out the audio file.
    } catch (Exception ex) {
      Console.Out.WriteLine(ex.Message);
      break;
    }
  }
}

녹음/녹화 중지

Stop 메서드를 호출하면 기록이 종료됩니다.

audRecorder.Stop();

정리

개체가 AudioRecord 더 이상 필요하지 않으면 Release 메서드를 호출하면 연결된 모든 리소스가 해제됩니다.

audRecorder.Release();

요약

Android OS는 오디오 재생, 녹음 및 관리를 위한 강력한 프레임워크를 제공합니다. 이 문서에서는 상위 수준 MediaPlayer 및 클래스를 사용하여 오디오를 재생하고 MediaRecorder 녹음하는 방법을 설명했습니다. 다음으로, 오디오 알림을 사용하여 여러 애플리케이션 간에 디바이스의 오디오 리소스를 공유하는 방법을 살펴보했습니다. 마지막으로 메모리 버퍼와 직접 인터페이스하는 하위 수준 API를 사용하여 오디오를 재생하고 녹음하는 방법을 다루었습니다.