AS3 Как регулировать буферизацию NetStream для потокового аудио AAC с использованием appendBytes

Я хотел бы получить доступ к аудиосэмплам, воспроизводимым с потоковой радиостанции AAC, и выполнить некоторую функцию обработки сигналов перед их передачей на устройство визуализации.

Я смог получить доступ к потоку байтов с помощью URLStreamProgressEvent.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)

}
Другие вопросы по тегам