AAC / MP4 не работает в NetStream в ActionScript 3 - PullRequest
4 голосов
/ 10 января 2010

Я пытаюсь воспроизвести удаленный файл AAC в ActionScript 3 во Flash CS3 и в настоящее время использую этот код:

var url:String = "<a href="http://a1.phobos.apple.com/us/r1000/020/Music/d4/50/94/mzm.kjjofihr.aac.p.m4a" rel="nofollow noreferrer">http://a1.phobos.apple.com/us/r1000/020/Music/d4/50/94/mzm.kjjofihr.aac.p.m4a</a>";<br /> var connect_nc:NetConnection = new NetConnection();<br /> connect_nc.connect(null);<br /> var stream_ns:NetStream = new NetStream(connect_nc);<br /> stream_ns.play(url);

(Это основано на: http://www.adobe.com/devnet/flashplayer/articles/hd_video_flash_player_03.html)

Нет ошибок, но звук не воспроизводится. Я получаю такое же поведение с локальным файлом AAC и с локальным видео MP4.

Если я использую URL или путь к файлу, который не является потоковым файлом, я получаю ошибку NetStream.Play.StreamNotFound, которая, как я предполагаю, означает, что поток найден в случае действительного URL. Если я использую локальный FLV, его звук воспроизводится просто отлично.

Если я добавлю следующий слушатель и трассировку (evt.info.code) в netStatusHandler, я увижу только любые коды (например, NetStream.Play.Start), отслеживаемые с помощью FLV. Коды AAC или MP4 не отслеживаются. stream_ns.addEventListener (NetStatusEvent.NET_STATUS, netStatusHandler);

То же самое относится и к добавлению этого прослушивателя (т. Е. Аргумент onMetaData отслеживается только с FLV, а не с другими типами файлов), причем metaDataListener определен как объект с методом onMetaData, который отслеживает его аргумент. stream_ns.client = metaDataListener;

Есть идеи о том, что здесь может пойти не так, или как его диагностировать?

Спасибо!

Ответы [ 3 ]

1 голос
/ 14 апреля 2012

Все в ActionScript 3.0 основано на событиях (за редким исключением, когда используются обратные вызовы).

Вам нужно прослушать NetStatusEvent с info.code "NetConnection.Connect.Success", чтобы иметь возможность вызывать функцию NetStream.play ().

Вот кое-что, что работает (я только что написал это и проверил для вас):

package
{
    import flash.display.Sprite;

    import flash.net.NetConnection;
    import flash.net.NetStream;

    import flash.events.NetStatusEvent;
    import flash.events.AsyncErrorEvent;
    import flash.events.Event;

    public class MainDocument extends Sprite
    {
        private var _connection:NetConnection=new NetConnection();
        private var _netStream:NetStream=null;

        private var _strM4AURL:String="http://a1.phobos.apple.com/us/r1000/020/Music/d4/50/94/mzm.kjjofihr.aac.p.m4a";

        //constructor
        public function MainDocument():void
        {
            this._connect();
        }

        private function _connect():void
        {
            this._connection.close();
            this._connection=new NetConnection();
            this._connection.addEventListener(NetStatusEvent.NET_STATUS, this._netStatusHandler);
            this._connection.addEventListener(AsyncErrorEvent.ASYNC_ERROR, this._asyncErrorHandler);

            this._connection.connect(null);
        }

        private function _netStatusHandler(event:NetStatusEvent):void
        {
            trace(event.info.code);
            switch (event.info.code)
            {
                case "NetConnection.Connect.Success":
                    this._requestAudio();
                    break;
            }
        }

        private function _requestAudio():void
        {
            if(this._netStream!==null)
                this._netStream.close();

            this._netStream=new NetStream(this._connection);

            this._netStream.addEventListener(NetStatusEvent.NET_STATUS, this._netStatusHandler);
            this._netStream.addEventListener(AsyncErrorEvent.ASYNC_ERROR, this._asyncErrorHandler);

            this._netStream.checkPolicyFile=false;

            this._netStream.play(this._strM4AURL);
        }

        private function _asyncErrorHandler(event:AsyncErrorEvent):void
        {
            trace(event);
        }
    }
}

Обратитесь к справочнику по языку ActionScript 3.0 для получения дополнительной информации.

1 голос
/ 03 февраля 2010

Как указано здесь http://www.adobe.com/devnet/flashplayer/articles/hd_video_flash_player_03.html то, что вы делаете, правильно.

var connect_nc:NetConnection = new NetConnection();
connect_nc.connect(null);
var stream_ns:NetStream = new NetStream(connect_nc);
stream_ns.play("RE-Sample.m4a");

Однако, ссылка ActionScript Language на nestream найдена здесь: http://www.adobe.com/livedocs/flash/9.0/ActionScriptLangRefV3/flash/net/NetStream.html#play%28%29

утверждает, что:

метод play ()

...

...

При использовании этого метода без Flash Media Server существуют соображения безопасности. Файл в изолированной программной среде с локальным доверием или с локальной сетью может загружать и воспроизводить видеофайл из удаленной изолированной среды, но не может получить доступ к данным удаленного файла без явного разрешения в виде файла междоменной политики. Кроме того, вы можете запретить использование этого метода в SWF-файле, работающем во Flash Player, установив параметр allowNetworking объекта и вставив теги в HTML-страницу, содержащую содержимое SWF.

... ...

Параметры ... arguments - Местоположение видеофайла для воспроизведения в виде объекта URLRequest или строки. В Flash Player и в содержимом AIR вне изолированной программной среды безопасности приложения можно воспроизводить локальные видеофайлы, которые хранятся в том же каталоге, что и SWF-файл, или в подкаталоге; однако вы не можете перейти к каталогу более высокого уровня.

Так что это, вероятно, проблема в изолированной программной среде безопасности.

0 голосов
/ 13 октября 2011

Существует большая вероятность того, что Оливер говорит, что это правда, поскольку вы не получаете никакой обратной связи от слушателей событий, связанных с NetStream, и получаете ответ StreamNotFound.

StreamNotFound, когда не подключается к FMS, означает, что у вас либо неверный путь, либо он не виден из-за проблем безопасности.

...