ActionScript 3でバッファー(ByteArray / Stream)からMP3サウンドを再生する方法は?
-
06-07-2019 - |
質問
だから。 MP3データを含むバッファ(このバッファを保存してbuffer.mp3と呼ぶと再生されますが、この状況ではファイルシステムに保存しないでください) 。 再生する必要がありますが、できません。どうすればよいですか
次のコードを再生して、そのbuffrer(ByteArray \ Stream)を再生しようとしました(サーバーからMP3データを取得します。そしてそれは応答です)。
protected function Play(event:MouseEvent):void
{
var mySound:Sound = new Sound();
mySound.addEventListener(SampleDataEvent.SAMPLE_DATA, soundFill);
mySound.play();
}
public function soundFill(event:SampleDataEvent):void
{
event.data.writeBytes(readResponse.buffer, 0, readResponse.buffer.length);
}
解決
SampleDataEvent.dataはMP3ではなく、圧縮されていない生のサンプルデータを想定しているため、これは機能しません。 http://wiki.github.com/claus/as3swfを使用します。代わりに/ play-mp3-directly-from-bytearray 。
他のヒント
mp3バイナリデータの解決策はないと思いますが、wavであれば、これは動作するはずです:
private function loaded(event:Event):void {
var urlStream:URLStream = event.target as URLStream;
bArr = new ByteArray();
urlStream.readBytes(bArr, 0);
/**
* Remove wav header here
*/
bArr.position = 0;
sampleMP3.addEventListener(SampleDataEvent.SAMPLE_DATA, sampleDataHandler);
soundChannel = sampleMP3.play();
}
private function sampleDataHandler(event:SampleDataEvent):void {
var bytesToRead:int = (bArr.bytesAvailable > 65536 ? 65536 : bArr.bytesAvailable);
event.data.writeBytes(bArr, bArr.position, bytesToRead);
bArr.position += bytesToRead;
}
データをサンプリングする前にwavヘッダーを削除することを忘れないでください。また、サンプルレートが44.1kHzの場合にのみ機能します。他のサンプルレートの場合、サンプルを手動で繰り返すか削除して、44.1kHzのようにする必要があります。左と&の両方を供給する必要があるため、モノラルサウンドに注意してください。 Flashへの正しいチャネルサンプル。サンプルを繰り返す必要があります。
良い出発点は、Popforgeのaudio.format.wavパッケージ内のWavDecoderクラスです。
以下は私にとってはうまくいきます:
package
{
import flash.display.Sprite;
import flash.events.Event;
import flash.events.SampleDataEvent;
import flash.media.Sound;
import flash.media.SoundChannel;
import flash.net.URLRequest;
import flash.net.URLStream;
import flash.utils.ByteArray;
public class QuickSoundTest extends Sprite
{
public var sampleMP3:Sound;
private var soundChannel:SoundChannel;
public var bArr:ByteArray;
public function QuickSoundTest()
{
sampleMP3 = new Sound();
var urlReq:URLRequest = new URLRequest("test.mp3");
var urlStream:URLStream = new URLStream();
urlStream.addEventListener(Event.COMPLETE, loaded);
urlStream.load(urlReq);
}
private function loaded(event:Event):void {
var urlStream:URLStream = event.target as URLStream;
bArr = new ByteArray();
urlStream.readBytes(bArr, 0, 40960);
sampleMP3.addEventListener(SampleDataEvent.SAMPLE_DATA, sampleDataHandler);
soundChannel = sampleMP3.play();
}
private function sampleDataHandler(event:SampleDataEvent):void {
event.data.writeBytes(bArr, 0, 40960);
}
}
}
readResponse ByteArrayに保存されている内容、または読み込み中にデータを読み込む方法を確認する必要がある場合があります。 URLLoaderDataFormat.BINARYを使用して、またはここで行ったようにURLStreamを使用して、URLLoaderが読み込まれていることを確認します。