站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2ME 专题[J2ME Q&A]MMAPI"Cannot parse this type of AMR"异常之讨论

[J2ME Q&A]MMAPI"Cannot parse this type of AMR"异常之讨论

摘要: [J2ME Q&A]MMAPI"Cannot parse this type of AMR"异常之讨论

[J2ME] MMAPI的Cannot parse this type of AMR异常之讨论

郑昀 草拟 20060417

[现象]

首先,我们假设遇到这种错误的人们了解如何使用MMAPI,从而排除代码使用不当问题。

那么在播放3gp媒体文件时遇到“java.lang.Exception: Cannot parse this type of AMR”的异常错误,如果怀疑是ffmpeg或者其他转换程序造成的话,那么你可以把Nokia手机自己拍摄的录像传到PC机上,这种文件格式就是3gp的,而且肯定是Nokia自己的手机程序能播放的。但是,不幸,我用mmapi在Nokia S60模拟器上播放这种文件时依然得到“java.lang.Exception: Cannot parse this type of AMR”错误,没有声音,只有视频。

我用下面的命令行:

<table class="MsoNormalTable" style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; MARGIN: auto auto auto 5.75pt; BORDER-LEFT: medium none; WIDTH: 94.9%; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid white .5pt; mso-yfti-tbllook: 480; mso-padding-alt: .7pt 5.75pt .7pt 5.75pt; mso-border-insideh: .5pt solid white; mso-border-insidev: .5pt solid white" cellspacing="0" cellpadding="0" width="94%" border="1"> <tr style="HEIGHT: 10.9pt; mso-yfti-irow: 0; mso-yfti-firstrow: yes"> <td style="BORDER-RIGHT: #ece9d8; PADDING-RIGHT: 5.75pt; BORDER-TOP: white 1pt solid; PADDING-LEFT: 5.75pt; BACKGROUND: #9faccb; PADDING-BOTTOM: 0.7pt; BORDER-LEFT: white 1pt solid; WIDTH: 405.05pt; PADDING-TOP: 0.7pt; BORDER-BOTTOM: white 1pt solid; HEIGHT: 10.9pt; mso-border-top-alt: solid white .5pt; mso-border-left-alt: solid white .5pt; mso-border-bottom-alt: solid white .5pt" valign="top" width="540">

Ffmpeg转换命令

</td> </tr> <tr style="HEIGHT: 15.45pt; mso-yfti-irow: 1"> <td style="BORDER-RIGHT: #ece9d8; PADDING-RIGHT: 5.75pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.75pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 0.7pt; BORDER-LEFT: white 1pt solid; WIDTH: 405.05pt; PADDING-TOP: 0.7pt; BORDER-BOTTOM: white 1pt solid; HEIGHT: 15.45pt; mso-border-top-alt: solid white .5pt; mso-border-left-alt: solid white .5pt; mso-border-bottom-alt: solid white .5pt" valign="top" width="540">

ffmpeg -y -i test.mpeg -bitexact -vcodec h263 -b 128 -r 15 -s 176x144 -acodec aac -ac 2 -ar 22500 -ab 24 -f 3gp test.3gp

</td> </tr> <tr style="HEIGHT: 15.45pt; mso-yfti-irow: 2; mso-yfti-lastrow: yes"> <td style="BORDER-RIGHT: #ece9d8; PADDING-RIGHT: 5.75pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.75pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 0.7pt; BORDER-LEFT: white 1pt solid; WIDTH: 405.05pt; PADDING-TOP: 0.7pt; BORDER-BOTTOM: white 1pt solid; HEIGHT: 15.45pt; mso-border-top-alt: solid white .5pt; mso-border-left-alt: solid white .5pt; mso-border-bottom-alt: solid white .5pt" valign="top" width="540">

或者

ffmpeg -y -i test.mpeg -ac 1 -acodec amr_nb -ar 8000 -s 176x144 -b 128 -r 15 test.3gp

</td> </tr> </table>

转换出来的3gp文件,都只能够在Nokia S60模拟器上播放视频,但没有声音,也得到了大量的java.lang.Exception: Cannot parse this type of AMR错误提示。

我为什么要怀疑仅仅是S60模拟器的问题呢。因为我把转换好的3gp文件放在我的服务器上,用

<table class="MsoNormalTable" style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; MARGIN: auto auto auto 5.75pt; BORDER-LEFT: medium none; WIDTH: 94.9%; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid white .5pt; mso-yfti-tbllook: 480; mso-padding-alt: .7pt 5.75pt .7pt 5.75pt; mso-border-insideh: .5pt solid white; mso-border-insidev: .5pt solid white" cellspacing="0" cellpadding="0" width="94%" border="1"> <tr style="HEIGHT: 10.9pt; mso-yfti-irow: 0; mso-yfti-firstrow: yes"> <td style="BORDER-RIGHT: #ece9d8; PADDING-RIGHT: 5.75pt; BORDER-TOP: white 1pt solid; PADDING-LEFT: 5.75pt; BACKGROUND: #9faccb; PADDING-BOTTOM: 0.7pt; BORDER-LEFT: white 1pt solid; WIDTH: 405pt; PADDING-TOP: 0.7pt; BORDER-BOTTOM: white 1pt solid; HEIGHT: 10.9pt; mso-border-top-alt: solid white .5pt; mso-border-left-alt: solid white .5pt; mso-border-bottom-alt: solid white .5pt" valign="top" width="540">

简单的播放代码

</td> </tr> <tr style="HEIGHT: 15.45pt; mso-yfti-irow: 1; mso-yfti-lastrow: yes"> <td style="BORDER-RIGHT: #ece9d8; PADDING-RIGHT: 5.75pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.75pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 0.7pt; BORDER-LEFT: white 1pt solid; WIDTH: 405pt; PADDING-TOP: 0.7pt; BORDER-BOTTOM: white 1pt solid; HEIGHT: 15.45pt; mso-border-top-alt: solid white .5pt; mso-border-left-alt: solid white .5pt; mso-border-bottom-alt: solid white .5pt" valign="top" width="540">

player = Manager.createPlayer(url);

player.realize();

player.prefetch();

</td> </tr> </table>

这种代码在Nokia7610真机上运行播放这个远端资源http://218.249.90.118/toodou/test.3gp ,结果完美无缺地播放了,有声音,有图像

所以说明Nokia 7610真机的MMAPI对于3gp文件中的音频解析是没问题的。出问题的是S60模拟器。

[小结]

综上所述,如果你遇到了"Cannot parse this type of AMR"的异常,那么请考虑你用来测试j2me程序的模拟器是不是有问题。不妨到真机上测试。



↑返回目录
前一篇: Java十年有成——谈J2ME的发展历史
后一篇: 我的第一个j2me程序