AS3 Как регулировать буферизацию NetStream для потокового аудио AAC с использованием appendBytes
Я хотел бы получить доступ к аудиосэмплам, воспроизводимым с потоковой радиостанции AAC, и выполнить некоторую функцию обработки сигналов перед их передачей на устройство визуализации.
Я смог получить доступ к потоку байтов с помощью URLStream
ProgressEvent.PROGRESS
Перезвоните. В рамках этого обратного вызова я изначально звонил urlStream.readBytes(Bytes)
с последующим netStream.appendBytes(Bytes)
, Звук будет воспроизводиться в течение некоторого количества секунд, а затем остановится с netStatus NetStream.Buffer.Empty
,
Я оставил след в моем ProgressEvent
обработчик, чтобы показать netStream.bufferLength
и увидел, что изначально он стал больше, а потом стал меньше, пока буфер не опустел. Я искал информацию о том, что может понадобиться для регулирования буфера, но ничего, что я нашел, не сработало.
Интересно, когда я выпускаю netStream.play(url)
а не netStream.play(null)
, что необходимо для включения ProgressEvent
обработчик, звук воспроизводится нормально, но у меня нет никакой видимости к основным образцам звука.
Поэтому мой вопрос сводится к следующему: как мне получить доступ к базовым аудиосэмплам и не дать буферу стать пустым?
package
{
import flash.display.Sprite;
import flash.net.NetConnection;
import flash.net.NetStream;
import flash.net.NetStreamAppendBytesAction;
import flash.net.NetStreamPlayOptions;
import flash.net.NetStreamInfo;
import flash.events.NetStatusEvent;
import flash.events.AsyncErrorEvent;
import flash.events.ProgressEvent;
import flash.events.Event;
import flash.net.URLRequest;
import flash.net.URLStream;
import flash.utils.*;
public class Main extends Sprite
{
private var connection:NetConnection = new NetConnection();
private var netStream:NetStream = null;
private var urlStream:URLStream = null;
private var urlRequest:URLRequest = null;
private var inputSamples:ByteArray = new ByteArray();
private var outputSamples:ByteArray = new ByteArray();
private var hTimer:uint = 0;
private var nState:int = 1;
private var url:String="*** replace this text with your favorite streaming AAC radio feed ***";
// Main Constructor
public function Main() : void
{
connectToStream();
}
private function connectToStream() : void
{
connection.close();
connection = new NetConnection();
connection.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
connection.addEventListener(AsyncErrorEvent.ASYNC_ERROR, asyncErrorHandler);
connection.connect(null);
}
private function netStatusHandler(event:NetStatusEvent) : void
{
trace("NetStatusEvent = " + event.info.code);
switch (event.info.code)
{
case "NetConnection.Connect.Success":
requestAudio();
break;
case "NetStream.Buffer.Empty":
//hTimer = setInterval(onTimerEvent, 1000);
break;
} // End switch
}
private function asyncErrorHandler(event:AsyncErrorEvent) : void
{
trace("Stream Error Handler - error = " + event);
}
public function onMetaData(info:Object) : void
{
trace("metadata: duration=" + info.duration + " framerate=" + info.framerate);
}
private function onTimerEvent() : void
{
}
private function requestAudio() : void
{
if (netStream !== null)
{
netStream.close();
}
netStream = new NetStream(this.connection);
netStream.client = new Object();
netStream.client.onMetaData = onMetaData;
netStream.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
netStream.addEventListener(AsyncErrorEvent.ASYNC_ERROR, asyncErrorHandler);
netStream.checkPolicyFile = false;
//netStream.play(url);
if (urlStream !== null)
{
urlStream.close();
}
urlStream = new URLStream();
urlStream.addEventListener(ProgressEvent.PROGRESS, progressHandler);
urlRequest = new URLRequest(url);
urlStream.load(urlRequest);
netStream.play(null);
netStream.appendBytesAction(NetStreamAppendBytesAction.RESET_BEGIN);
}
// Process audio samples from file
private function progressHandler(event:ProgressEvent) : void
{
var streamByte:int;
// Position to beginning of buffer
inputSamples.position = 0;
urlStream.readBytes(inputSamples);
// *** want to do some signal processing here ***
// For now just copy the input to the output
// Position to beginning of buffer
outputSamples.position = 0;
// This output indicates that the buffer is being drained
// until I get NetStream.Buffer.Empty and the audio stops playing
trace("Buffer Length = " + netStream.bufferLength);
while (inputSamples.bytesAvailable)
{
streamByte = inputSamples.readByte();
outputSamples.writeByte(streamByte);
}
// Position to beginning of buffer
outputSamples.position = 0;
netStream.appendBytes(outputSamples);
}
}
}
1 ответ
Попробуй это:
import flash.media.Video
var stream = 'http://2583.live.streamtheworld.com/KFMXFMAAC'
var http_stream:URLStream = null
var video:Video = new Video() // the video is used only to ensure that stream is playing
addChild(video)
var nc:NetConnection = new NetConnection()
nc.connect(null)
var ns:NetStream = new NetStream(nc)
ns.client = new Object()
ns.client.onMetaData = function(e){}
ns.play(null)
video.attachNetStream(ns)
http_stream = new URLStream();
http_stream.addEventListener(ProgressEvent.PROGRESS, on_Progress)
http_stream.load(new URLRequest(stream))
function on_Progress(e:ProgressEvent):void {
var b:ByteArray = new ByteArray()
http_stream.readBytes(b, 0, http_stream.bytesAvailable)
ns.appendBytes(b)
trace(ns.bufferLength)
}