小编ara*_*kn0的帖子

MediaPlayer,原始资源,停止和启动的问题

我是Android开发的新手,我有一个问题/疑问.

我正在玩MediaPlayer类来重现一些声音/音乐.我正在玩原始资源(res/raw),看起来很容易.

要播放原始资源,MediaPlayer必须像这样初始化:


MediaPlayer mp = MediaPlayer.create(appContext, R.raw.song);
mp.start();

直到这里没有问题.声音播放,一切正常.当我想为我的应用程序添加更多选项时,会出现我的问题.特别是当我添加"停止"按钮/选项时.

基本上,我想要做的是......当我按下"停止"时,音乐停止.当我按"开始"时,歌曲/声音重新开始.(非常基本!)

要停止媒体播放器,您只需要拨打电话stop().但要再次播放声音,媒体播放器必须重新制作并准备好.


mp.reset();
mp.setDataSource(params);
mp.prepare();

问题是该方法setDataSource()仅接受文件路径,内容提供者URI,流媒体URL路径或文件描述符作为参数.

因此,由于此方法不接受资源标识符,因此我不知道如何设置数据源以便调用prepare().另外,我不明白为什么你不能使用Resouce标识符来设置数据源,但是在初始化MediaPlayer时你可以使用资源标识符.

我想我错过了一些东西.我想知道我是否在混合概念,并且stop()不必在"停止"按钮中调用该方法.有帮助吗?

提前致谢!!!

android media-player

24
推荐指数
4
解决办法
3万
查看次数

重采样/上采样声音帧从8Khz到48Khz(Java/Android)

我正在尝试为andriod开发的应用程序,以48Khz(PCM 16位和单声道)记录帧并将它们发送到网络.此外,还有一个8Khz的传入音频流.所以,我接收8Khz采样帧并播放它们(我的AudioTrack对象设置为8Khz),但是当它们播放时,一切正常,但延迟是巨大的.你听到的东西大约需要3秒钟.

我认为如果我将接收到的帧从8Khz上采样到48Khz并播放它们,那么就不会有如此巨大的播放延迟.事实上,当我以相同的速率录制和播放帧时,延迟非常低.坏事是我被迫这样做:发送到48Khz并接收到8Khz.

如前所述,我正在尝试将声音帧(16位PCM)从8Khz上采样到48Khz.有人知道Java中的任何例程/库/ API吗?

我知道关于对一个谨慎信号进行上采样的基础知识,但我认为设计和实现我自己的FIR滤波器并将其与音频流进行卷积....太过分了.而且,据我所知.

那么......有人能帮助我吗?有没有人知道我可以使用Java中的任何库/例程?任何建议或替代方案?

java audio android audio-streaming resampling

5
推荐指数
1
解决办法
8972
查看次数

MediaRecorder类记录音频的问题 - prepare()给出异常 - 权限被拒绝

我是Android开发的新手,我有下一个问题/问题.

我正在玩MediaRecorder类来录制麦克风中的音频.我正在按照官方网站上指示的步骤操作:http://developer.android.com/reference/android/media/MediaRecorder.html

所以我有一个初始化和配置MediaRecorder对象的方法,以便开始录制.在这里你有代码:


        //initializes audio recorder
        MediaRecorder mrecorder = new MediaRecorder();
        //configure the input sources
        mrecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        //set the output format
        mrecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        //set the audio encoding
        mrecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
        //specify the output file
        mrecorder.setOutputFile("/sdcard/test.3gp");
        //prepare for recording
        try {
            mrecorder.prepare();
        } catch (IllegalStateException e) { 
            e.printStackTrace();
            Log.d("Syso". e.toString());
        } catch (IOException e) { 
            e.printStackTrace();
            Log.d("Syso". e.toString());
        }
Run Code Online (Sandbox Code Playgroud)

当我在模拟器中执行此代码时,感谢logcat,我可以看到方法prepare()在调用时给出异常:


java.io.FileNotFoundException: /sdcard/test.3gp (Permission denied)
Run Code Online (Sandbox Code Playgroud)

我不知道为什么会这样.由于异常消息,我通过在xml中添加以下行来在清单中授予访问存储的权限:


<uses-permission android:name="android.permission.STORAGE" />
Run Code Online (Sandbox Code Playgroud)

但这并没有解决任何问题,我仍然会一直得到同样的例外.SDCard是根据模拟器安装的,所以我不知道.

android exception audio-recording permission-denied mediarecorder

4
推荐指数
1
解决办法
5204
查看次数

基本菜单示例中的XML问题

我正在尝试使用一些菜单创建一个应用程序,我正在关注官方android站点中提供的基本示例:

http://developer.android.com/guide/topics/ui/menus.html

当我在XML中定义菜单时出现我的问题.创建文件夹res/menu并从eclipse创建menu_option.xml文件后....项目(通常)给出了一个错误,可以从Problems选项卡中读取:

 
Unparsed aapt error(s)! Check the console for output
Android Packaging Problem

因此,更改为"控制台"选项卡以获取有关该问题的更多信息,可以阅读:

 
[2010-06-02 11:35:54 - TestAudio] Error in an XML file: aborting build.
[2010-06-02 11:35:54 - TestAudio] W/ResourceType(11566): Bad XML block: header size 63327 or total size -144759824 is larger than data size 0
[2010-06-02 11:35:54 - TestAudio] /home/User/workspace/TestAudio/res/menu/options_menu.xml:1: error: Error parsing XML: no element found

奇怪的是,eclipse识别我在XML中定义的菜单项,我可以在代码中引用它们而没有任何问题,我的主要活动构建.(以及其他文件).

可能是因为当eclipse创建文件时,出于某种原因,Android SDK有读取它的问题,或类似的东西?

XML代码与示例中的代码完全相同,所以我真的不知道发生了什么.options_menu.xml中的代码是这样的:

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/new_game"
          android:title="New Game" />
    <item android:id="@+id/quit"
          android:title="Quit" />
</menu>

在此先感谢您的帮助!

xml android menu

3
推荐指数
1
解决办法
1万
查看次数

在Java中从short转换为byte,反之亦然

我正在尝试将短路转换为2个字节...然后从这2个字节尝试获得相同的短路值.为此,我写了这段代码:


        short oldshort = 700;

        byte 333= (byte) (oldshort);
        byte byte2= (byte) ((oldshort >> 8) & 0xff);

        short newshort = (short) ((byte2 << 8) + byte1);

            System.out.println(oldshort);
        System.out.println(newshort);
Run Code Online (Sandbox Code Playgroud)

对于700(oldshort)的值,newhosrt是444.经过一些测试后,它看起来像这样的代码只适用于某些值.就像...如果oldshort = 50,那么它将正常工作..但如果它是-200,或更大的值超过127(我认为)它不起作用.我想有签名字节,二进制补码等问题...但我无法弄清楚如何解决它.

任何的想法??在java中以任何本地方式执行此操作?提前致谢!

java byte short typeconverter

3
推荐指数
1
解决办法
1万
查看次数

"你好,WebView"的例子

我是android开发的新手,我正在试用官方android站点中的WebView示例.

http://developer.android.com/guide/tutorials/views/hello-webview.html

但我做他们说的一切......这很简单:我创建项目,编辑布局文件,然后我添加代码等等.没有问题构建...但是当我在模拟器中启动应用程序时我才刚刚得到黑屏.就像布局是空的一样......就像没有创建WebView一样.

我究竟做错了什么?

android webview android-webview

0
推荐指数
1
解决办法
2万
查看次数