1
回答
Jspeex转换出来的wav音频不被standing wave识别,无法播放
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   

环境:JDK 1.7, Flex 4, Win7/8/8.1

前提:手机端的语音压缩用的是Speex。并把文件用Base64转码了。

公司项目需求:在Flex平台接收来自手机端发来的语音并播放。

项目结构:前台Flex,后台Java。

解决方案:

    1、直接在Flex端接收语音的编码然后解码并播放。

        但是我搜索了两天,发现在Flex端没有用AS3写的speex的实现,也没找到例子。唯一的一个线索是,一个老外说用AS3重写speex。OMG,我时间有限,另外我貌似也搞不定。。。

    2、在后台Java端解码,然后写入spx文件,spx文件转换为flex可识别的语音格式,后台给前台一个文件地址,然后前台播放。

        JSpeex版本:0.9.8  ;      Standing Wave 版本:2

        采用JSpeex来转换spx,可输出为wav格式。但是Flex只识别MP3和Flv的音频,只好再次搜索,找到一个Flex的类库Standing Wave ,可以实现在Flex端播放wav音频。自己写了Flex的Demo来播放wav音频,但是我发现用JSpeex转换过来的wav就是没法用Standing Wave播放,也不报错,Standing Wave倒是可以播放其他一些wav文件。

代码如下:

Java端:


String[] sourceAndDest = new String[]{"F:\\java\\speex\\jspeex\\dist\\input.spx", "F:\\java\\speex\\jspeex\\dist\\output.wav"};


            JSpeexDec decoder = new JSpeexDec();
            if (decoder.parseArgs(sourceAndDest)) {
                decoder.decode();
            }




Flex端:


import com.noteflight.standingwave2.elements.Sample;
        import com.noteflight.standingwave2.formats.WaveFile;
        import com.noteflight.standingwave2.output.AudioPlayer;


        var file:FileReference;
        var player:AudioPlayer = new AudioPlayer();

        var content:ByteArray = null;
        var sample:Sample = null;

        // 文件路径
        var urlStr:String = "C:\\CiatMonitor\\tempDir\\chatvoice\\wav\\20140729113707.wav";

        /**
         * 初始化请求加载文件
         */
        public function init():void {
            var urlRequest:URLRequest = new URLRequest(urlStr);

            var loader:URLLoader = new URLLoader();
            loader.dataFormat = URLLoaderDataFormat.BINARY;
            loader.addEventListener(Event.COMPLETE, completeLoad);
            loader.load(urlRequest);
        }

        /**
         * 加载文件结束
         * @param evt
         */
        function completeLoad(evt:Event):void {
            content = evt.target.data as ByteArray;
        }

        /**
         * 播放声音
         */
        function playVoice():void
        {
            player.play(WaveFile.createSample(content));
        }

        /**
         * 停止播放
         */
        function stopVoice():void
        {
            player.stop();
        }




请教高手来给小弟以指导啊,我是真过不去了,静候答案。

举报
bravehlp
发帖于3年前 1回/740阅
顶部