원시 사운드 데이터 액세스

Flash Player 9 이상, Adobe AIR 1.0 이상

SoundMixer.computeSpectrum() 메서드를 사용하면 현재 재생 중인 파형에 대한 원시 사운드 데이터를 응용 프로그램이 읽을 수 있습니다. 둘 이상의 SoundChannel 객체가 현재 재생 중인 경우, SoundMixer.computeSpectrum() 메서드는 함께 믹싱된 모든 SoundChannel 객체의 조합된 사운드 데이터를 표시합니다.

사운드 데이터는 512바이트의 데이터가 포함된 ByteArray 객체로 반환되며 각 객체는 -1과 1 사이의 부동 소수점 값을 포함합니다. 이러한 값은 재생 중인 사운드 파형의 위치 진폭을 나타냅니다. 값은 두 개의 256바이트 그룹으로 제공됩니다. 첫 번째 그룹은 왼쪽 스테레오 채널용이고 두 번째 그룹은 오른쪽 스테레오 채널용입니다.

FFTMode 매개 변수가 true 로 설정된 경우, SoundMixer.computeSpectrum() 메서드는 파형 데이터가 아니라 주파수 스펙트럼 데이터를 반환합니다. 주파수 스펙트럼은 가장 낮은 주파수에서 가장 높은 주파수까지 사운드 주파수에 따라 배열된 진폭을 표시합니다. FFT(Fast Fourier Transform)는 파형 데이터를 주파수 스펙트럼 데이터로 변환하는 데 사용됩니다. 결과 주파수 스펙트럼 값은 0에서 약 1.414(2의 제곱근)까지입니다.

다음 그림에서는 FFTMode 매개 변수가 true 로 설정되었을 때와 false 로 설정되었을 때 computeSpectrum() 메서드로부터 반환된 데이터를 비교합니다. 이 그림에 사용된 사운드 데이터는 왼쪽 채널은 큰 베이스 사운드, 오른쪽 채널은 드럼 사운드에 대한 것입니다.
전체 화면으로 그래픽 보기
SoundMixer.computeSpectrum() 메서드에 의해 반환된 값
A.
fftMode=true

B.
fftMode=false

또한 computeSpectrum() 메서드는 더 낮은 비트율로 다시 샘플링된 데이터를 반환할 수 있습니다. 이렇게 하면 일반적으로 더 부드러운 파형 데이터 또는 주파수 데이터가 반환되고 세부적인 요소는 제거됩니다. stretchFactor 매개 변수는 computeSpectrum() 메서드 데이터가 샘플링되는 속도를 제어합니다. stretchFactor 매개 변수가 기본값인 0으로 설정된 경우 사운드 데이터는 44.1kHz의 속도로 샘플링됩니다. 이 속도는 stretchFactor 매개 변수의 각 연속 값에서 절반으로 되어 값 1은 22.05kHz, 값 2는 11.025kHz 등으로 속도를 지정합니다. computeSpectrum() 메서드는 더 높은 stretchFactor 값이 사용되어도 스테레오 채널당 256바이트를 반환합니다.

SoundMixer.computeSpectrum() 메서드는 다음과 같은 제한 사항이 있습니다.

  • 마이크 또는 RTMP 스트림의 사운드 데이터는 전역 SoundMixer 객체를 통과하지 않으므로 SoundMixer.computeSpectrum() 메서드는 이러한 소스로부터 데이터를 반환하지 않습니다.

  • 재생 중인 하나 이상의 사운드가 현재 내용 샌드박스 외부의 소스로부터 제공되는 경우 보안 제한 사항으로 인해 SoundMixer.computeSpectrum() 메서드에서 오류가 발생할 수 있습니다. SoundMixer.computeSpectrum() 메서드의 보안 제한에 대한 자세한 내용은 사운드 로드 및 재생 시의 보안 고려 사항 데이터로 로드된 미디어 액세스 를 참조하십시오.

하지만 AIR 응용 프로그램에서 응용 프로그램 보안 샌드박스의 내용(AIR 응용 프로그램과 함께 설치된 내용)은 이러한 보안 제한에 의해 제한되지 않습니다.

간단한 사운드 파형 표시기 만들기

다음 예제에서는 SoundMixer.computeSpectrum() 메서드를 사용하여 각 프레임과 함께 움직이는 사운드 파형 차트를 표시합니다.

import flash.display.Graphics; 
import flash.events.Event; 
import flash.media.Sound; 
import flash.media.SoundChannel; 
import flash.media.SoundMixer; 
import flash.net.URLRequest; 
 
const PLOT_HEIGHT:int = 200; 
const CHANNEL_LENGTH:int = 256; 
 
var snd:Sound = new Sound(); 
var req:URLRequest = new URLRequest("bigSound.mp3"); 
snd.load(req); 
 
var channel:SoundChannel; 
channel = snd.play(); 
addEventListener(Event.ENTER_FRAME, onEnterFrame); 
snd.addEventListener(Event.SOUND_COMPLETE, onPlaybackComplete); 
 
var bytes:ByteArray = new ByteArray(); 
 
function onEnterFrame(event:Event):void 
{ 
    SoundMixer.computeSpectrum(bytes, false, 0); 
     
    var g:Graphics = this.graphics; 
     
    g.clear(); 
    g.lineStyle(0, 0x6600CC); 
    g.beginFill(0x6600CC); 
    g.moveTo(0, PLOT_HEIGHT); 
     
    var n:Number = 0; 
         
    // left channel 
    for (var i:int = 0; i < CHANNEL_LENGTH; i++)  
    { 
        n = (bytes.readFloat() * PLOT_HEIGHT); 
        g.lineTo(i * 2, PLOT_HEIGHT - n); 
    } 
    g.lineTo(CHANNEL_LENGTH * 2, PLOT_HEIGHT); 
    g.endFill(); 
     
    // right channel 
    g.lineStyle(0, 0xCC0066); 
    g.beginFill(0xCC0066, 0.5); 
    g.moveTo(CHANNEL_LENGTH * 2, PLOT_HEIGHT); 
     
    for (i = CHANNEL_LENGTH; i > 0; i--)  
    { 
        n = (bytes.readFloat() * PLOT_HEIGHT); 
        g.lineTo(i * 2, PLOT_HEIGHT - n); 
    } 
    g.lineTo(0, PLOT_HEIGHT); 
    g.endFill(); 
} 
 
function onPlaybackComplete(event:Event) 
{ 
    removeEventListener(Event.ENTER_FRAME, onEnterFrame); 
}

이 예제는 사운드 파일을 로드하여 재생한 다음, 사운드 재생 동안 onEnterFrame() 메서드를 트리거할 Event.ENTER_FRAME 이벤트를 수신합니다. onEnterFrame() 메서드는 사운드 웨이브 데이터를 bytes ByteArray 객체에 저장하는 SoundMixer.computeSpectrum() 메서드를 호출하는 것으로 시작됩니다.

사운드 파형은 벡터 드로잉 API를 사용하여 그려집니다. for 루프는 왼쪽 스테레오 채널을 나타내는 처음 256개 데이터 값을 찾은 후 Graphics.lineTo() 메서드를 사용하여 각각의 위치 사이에 차례로 선을 그립니다. 두 번째 for 루프는 다음 세트의 256개 값을 순환한 후 이 값들을 역순으로(오른쪽에서 왼쪽으로) 배치합니다. 결과 파형 형태는 다음 이미지와 같이 흥미로운 거울 이미지 효과를 나타낼 수 있습니다.