2010-01-10 6 views
4

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

var url:String = " http://a1.phobos.apple.com/us/r1000/020/Music/d4/50/94/mzm.kjjofihr.aac.p.m4a ";
var connect_nc:NetConnection = new NetConnection();
connect_nc.connect(null);
var stream_ns:NetStream = new NetStream(connect_nc);
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;

Любые идеи о том, что здесь может быть неправильным, или как его диагностировать?

Спасибо!

ответ

0

Как указано здесь 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 язык упоминание о nestream здесь: http://www.adobe.com/livedocs/flash/9.0/ActionScriptLangRefV3/flash/net/NetStream.html#play%28%29

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

игры() метод

...

...

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

... ...

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

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

0

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

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

1

Все в 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); 
     } 
    } 
} 

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