Apache flex AdobeFlexConvert";。ogg";带有Ogg Vorbis编码器的文件,用于与声音类一起播放

Apache flex AdobeFlexConvert";。ogg";带有Ogg Vorbis编码器的文件,用于与声音类一起播放,apache-flex,audio,encoding,ogg,oggvorbis,Apache Flex,Audio,Encoding,Ogg,Oggvorbis,我正在尝试从URL获取一个“.ogg”文件,并在我的Flex程序中播放它 我用“.mp3”文件做了一个测试,它工作正常,代码如下: public function getFileRemote(url:String, id:String):void{ var s:Sound = new Sound(); s.addEventListener(Event.COMPLETE, onSoundLoaded); var

我正在尝试从URL获取一个“.ogg”文件,并在我的Flex程序中播放它

我用“.mp3”文件做了一个测试,它工作正常,代码如下:

        public function getFileRemote(url:String, id:String):void{
            var s:Sound = new Sound();
            s.addEventListener(Event.COMPLETE, onSoundLoaded);
            var req:URLRequest = new URLRequest(url);   
            s.load(req);

        }

        private function onSoundLoaded(event:Event):void
        {
            var localSound:Sound = event.target as Sound;
            localSound.play();
        }
但是,对于“.ogg”格式的文件,它不起作用。所以,我已经检查了一些可能的解决方案,我正在,尝试用

我现在实现的代码:

        public function getFileRemote(url:String, id:String):void  
        {  
            urlStream = new URLStream();
            var urlReq:URLRequest = new URLRequest(url);  
            urlStream.addEventListener(Event.COMPLETE, loaded);  
            urlStream.load (urlReq);
        }  

        private function handleSoundData(e:SampleDataEvent):void
        {//handleSoundData
            var result:Object;
            var tmpBuffer:ByteArray = new ByteArray();
            result = _oggManager.getSampleData(NUM_SAMPLES, tmpBuffer);

            if (tmpBuffer.length < NUM_SAMPLES * BYTES_PER_SAMPLE)
            {//reset
                trace("Reset");
                //Right now the only way to rewind is reseting the decoder
                _oggManager.initDecoder(_oggBytes);
                result = _oggManager.getSampleData( NUM_SAMPLES, tmpBuffer);
            }//reset

            tmpBuffer.position = 0; 
            while (tmpBuffer.bytesAvailable)
            {//feed
                //feed data
                e.data.writeFloat(tmpBuffer.readFloat());       //Left Channel
                e.data.writeFloat(tmpBuffer.readFloat());       //Right Channel
            }//feed

        }//handleSoundData

        private function loaded(event:Event):void  
        {  
            urlStream.readBytes(_oggBytes, 0, urlStream.bytesAvailable);
            //urlStream.readBytes(_oggBytes);
            _oggManager.decode(_oggBytes);
            //_oggManager.initDecoder(_oggBytes);
            //Make sound
            _sound = new Sound();
            _sound.addEventListener(SampleDataEvent.SAMPLE_DATA, handleSoundData, false, 0, true);
            _soundChannel = _sound.play();
            //trace(urlLoader.data);
        }  */
那么,有什么建议吗?还有其他可能的解决办法吗

更新

最后,我选择了另一个解决方案。 我拒绝将ogg音频转换为mp3。
取而代之的是,现在ogg音频在服务器中,我只需要URL就可以通过MainApp.html文件中的音频html标记播放它们。更简单、更高效。

我找到了解决这个问题的另一种方法

我没有将.ogg文件转换为.mp3文件,而是修改了代码,以便在应用程序中直接从其url(存储在服务器中)复制.ogg文件

将此代码添加到主应用程序html文件(在我的例子中是Admin.html):


var media=document.getElementById(“audioOgg”);
var cp=document.getElementById(“Admin”);
听觉变异;
功能playAudio(audioURL,id){
media.src=audioURL;
audioId=id;
媒体播放();
cp.onStartAudio(audioId);
}
函数pauseAudio(){
媒体暂停();
}
并将此代码保存到.mxml文件中:

 <?xml version="1.0" encoding="utf-8"?>
 <mx:TitleWindow xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" title="Audio List" 
                horizontalScrollPolicy="off" verticalScrollPolicy="auto" width="510" height="340" 
                showCloseButton="true" close="closeWindow()">
    <mx:Script>
        <![CDATA[
            import flash.external.ExternalInterface;

            import mx.collections.ArrayCollection;
            import mx.events.FlexEvent;
            import mx.managers.PopUpManager;
            import mx.controls.Alert;

            [Embed(source='../assets/play-btn-small.png')]
            var Play:Class;
            [Embed(source='../assets/stop-btn-small.png')]
            var Stop:Class;

            [Blindable]
            public var dpc:ArrayCollection;

            public function playAudio(audioURL:String, audioId:String){
                ExternalInterface.call("playAudio", audioURL, id);
            }

            public function pauseAudio(){
                ExternalInterface.call("pauseAudio");   
            }
        ]]>
    </mx:Script>
    <mx:Rotate id="rotate" />
    <mx:Zoom id="zoom" />
    <mx:VBox top="0" bottom="0" left="0" right="0" paddingTop="20" paddingLeft="20">
        <mx:Text fontWeight="bold" height="20">
            <mx:text>Click the play/pause button for listening/pause each audio individually:</mx:text>
        </mx:Text>
    </mx:VBox>
    <mx:DataGrid id="gridAudios" top="50" bottom="20" left="20" right="20" width="100%" doubleClickEnabled="false">
        <mx:columns>
            <mx:DataGridColumn headerText="Name" dataField="audioId"/>
            <mx:DataGridColumn id="btnCol" headerText="" textAlign="center">
                <mx:itemRenderer>
                    <mx:Component>
                        <mx:HBox horizontalAlign="center">
                            <mx:Script>
                                <![CDATA[
                                    protected function image1_clickHandler(event:MouseEvent):void
                                    {
                                        if (data.status=='playing'){
                                            outerDocument.pauseAudio(); 
                                            data.status='';
                                        }else{
                                            outerDocument.playAudio(data.url,data.audioId);
                                            data.status='playing';
                                        }
                                    }
                                ]]>
                            </mx:Script>

                            <mx:Image click="image1_clickHandler(event)" 
                                      toolTip="{data.status=='playing' ? 'Stop' : 'Play'}"
                                      useHandCursor="true" source="{data.status=='playing' ? outerDocument.Stop : outerDocument.Play}"/>
                        </mx:HBox>
                    </mx:Component>
                </mx:itemRenderer>
            </mx:DataGridColumn>
        </mx:columns>
    </mx:DataGrid>
</mx:TitleWindow>

单击播放/暂停按钮分别收听/暂停每个音频:

多亏了ExternalInterface类,我能够调用Admin.html文件中声明的Javascript函数,以复制和停止标记元素的音频,并将音频url和音频标识符作为参数传递。

与论坛网站不同,我们不使用“谢谢”或“感谢任何帮助”或签名。顺便说一句,这是“提前感谢”,不是“提前感谢”“@johnsaunds很清楚
\u oggManager
在哪里定义?在加载的
函数中,该值似乎为空。@Brian抱歉,伙计,我刚刚更新了该问题,因为我找到了该问题的替代解决方案。无论如何谢谢你!发布你的解决方案!如果这是你自己问题的答案,请将其标记为正确答案。干杯
    <audio id="audioOgg">
         <source src='' type='audio/ogg'>
    </audio>

    <script language="JavaScript" type="text/javascript">
        var media = document.getElementById("audioOgg");
        var cp=document.getElementById("Admin");
        var audioId;
        function playAudio(audioURL, id) {
            media.src = audioURL;
            audioId = id;
            media.play();
            cp.onStartAudio(audioId);
        }
        function pauseAudio() {
            media.pause();
        }
    </script>
 <?xml version="1.0" encoding="utf-8"?>
 <mx:TitleWindow xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" title="Audio List" 
                horizontalScrollPolicy="off" verticalScrollPolicy="auto" width="510" height="340" 
                showCloseButton="true" close="closeWindow()">
    <mx:Script>
        <![CDATA[
            import flash.external.ExternalInterface;

            import mx.collections.ArrayCollection;
            import mx.events.FlexEvent;
            import mx.managers.PopUpManager;
            import mx.controls.Alert;

            [Embed(source='../assets/play-btn-small.png')]
            var Play:Class;
            [Embed(source='../assets/stop-btn-small.png')]
            var Stop:Class;

            [Blindable]
            public var dpc:ArrayCollection;

            public function playAudio(audioURL:String, audioId:String){
                ExternalInterface.call("playAudio", audioURL, id);
            }

            public function pauseAudio(){
                ExternalInterface.call("pauseAudio");   
            }
        ]]>
    </mx:Script>
    <mx:Rotate id="rotate" />
    <mx:Zoom id="zoom" />
    <mx:VBox top="0" bottom="0" left="0" right="0" paddingTop="20" paddingLeft="20">
        <mx:Text fontWeight="bold" height="20">
            <mx:text>Click the play/pause button for listening/pause each audio individually:</mx:text>
        </mx:Text>
    </mx:VBox>
    <mx:DataGrid id="gridAudios" top="50" bottom="20" left="20" right="20" width="100%" doubleClickEnabled="false">
        <mx:columns>
            <mx:DataGridColumn headerText="Name" dataField="audioId"/>
            <mx:DataGridColumn id="btnCol" headerText="" textAlign="center">
                <mx:itemRenderer>
                    <mx:Component>
                        <mx:HBox horizontalAlign="center">
                            <mx:Script>
                                <![CDATA[
                                    protected function image1_clickHandler(event:MouseEvent):void
                                    {
                                        if (data.status=='playing'){
                                            outerDocument.pauseAudio(); 
                                            data.status='';
                                        }else{
                                            outerDocument.playAudio(data.url,data.audioId);
                                            data.status='playing';
                                        }
                                    }
                                ]]>
                            </mx:Script>

                            <mx:Image click="image1_clickHandler(event)" 
                                      toolTip="{data.status=='playing' ? 'Stop' : 'Play'}"
                                      useHandCursor="true" source="{data.status=='playing' ? outerDocument.Stop : outerDocument.Play}"/>
                        </mx:HBox>
                    </mx:Component>
                </mx:itemRenderer>
            </mx:DataGridColumn>
        </mx:columns>
    </mx:DataGrid>
</mx:TitleWindow>