jjzjj

Android 媒体播放器音频故障/断断续续仅在较新的设备上

coder 2023-12-06 原文

我有一个相当标准的媒体播放器对象,它在 onCreate 中启动并在我的应用程序中循环播放背景音乐。该文件不是特别大,它是一个 6MB 的 MP3。来自 onCreate:

MediaPlayer mp;
mp = MediaPlayer.create(MainActivity.this, R.raw.lostmexicancity);
mp.setLooping(true);
mp.setVolume(0.4f, 0.4f);
mp.start();

这在我的大多数测试设备上运行良好,包括旧手机、Samsung Galaxy Tab 2 10"平板电脑,甚至 Nexus 4。

不幸的是,我在 Nexus 5 和更新的 Nexus 10 上遇到音频故障/断断续续的问题,这些问题只发生在更新的设备上,通常是在正常播放几秒钟后,而不是立即出现。我的 Nexus 4 和 5 都运行 Android 4.4.4,但问题只发生在 Nexus 5 上。

当我暂停该媒体播放器对象并在短时间内播放另一个播放器对象时(游戏中短时间战斗的战斗音乐),这个问题似乎会加剧,但即使没有这种额外的并发症,也会出现故障。

我了解到较新版本的 Android 会导致 Mediaplayer 出现问题,但我还没有找到解决方法或建议。

是否有任何其他人遇到过此问题可以提出修复或解决方法的建议?感谢您的宝贵时间!

最佳答案

我注意到我的 Android 设备上也出现了这种情况。

我注意到您没有调用 Prepare(),这是播放音频之前的一个重要函数。 编辑——只有在使用 new 创建 MediaPlayer 时才需要准备调用,而不是使用内置的 MediaPlayer.Create()。

至于在源之间切换时出现的问题,我建议在您要播放的音频中准确调用 SeekTo() 时间,然后使用 SeekComplete 监听器等待该位置。在评论中,我有一小行 hacky 代码,直到调用开始后才在 mediaPlayer 上设置音量。这似乎减少了卡顿,但您可能会丢失第一小部分音频。

我使用的是 Xamarin Studio C#,但即使您使用的是 Java,同样的方法也应该有效。

MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.SetAudioStreamType (Android.Media.Stream.Music);
mediaPlayer.SetDataSource ("dataSourcePath");

mediaPlayer.Looping = true;

//It is necessary to call prepare after setting the data source
mediaPlayer.Prepare ();

//Ensure the audio has seeked to the position you need
bool seekingComplete = false;
mediaPlayer.SeekComplete += (object sender, EventArgs e) => {
    seekingComplete = true;
};

mediaPlayer.SeekTo(0);

//Forces the audio to complete seeking
while(seekingComplete == false)
{
    //Here, you just wait 2 milliseconds at a time 
    //for this buffering and seeking to complete
    await Task.Delay(2);
}

mediaPlayer.Start();

//Hacky way to prevent the glitch sound at the start is to set the
//volume after calling start
//mediaPlayer.SetVolume(0.4f, 0.4f);

关于Android 媒体播放器音频故障/断断续续仅在较新的设备上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28033653/

有关Android 媒体播放器音频故障/断断续续仅在较新的设备上的更多相关文章

  1. 怎样用一台手机做自媒体? - 2

    其实做自媒体的成本并不高,入门只需要一部手机即可!在手机上找视频素材、使用手机剪辑视频、最后使用手机发布视频作品获得收益!方法并不难,今天这期内容就来给粉丝们分享一种小方法,每天稳定收益100-300,抓紧点赞收藏!1、找素材(1)使用手机拍摄自己喜欢的经典段落,使用程序把文案内容提取出来(2)也可以在豆瓣、知乎、微博等网站中找一些自己需要的文案素材(3)把文案进行润色修改,可以加入一些自己的观点(4)视频素材可以使用软件中自带的素材,也可以在素材网站中下载完整版的素材2、文案配音(1)把复制好的文案直接导入小程序中(2)调整音色、音调后一键合成音频即可(3)可以选择自己朗读配音,需要花一点时

  2. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  3. ruby-on-rails - NameError(未初始化常量 Unzipper::Zip)但仅在 Heroku 部署(Rails)上 - 2

    我有一个类unzipper.rb,它使用Rubyzip解压文件。在我的本地环境中,我可以成功解压缩文件,而无需使用require'zip'明确包含依赖项但是在Heroku上,我得到一个NameError(uninitializedconstantUnzipper::Zip)我只能通过使用明确的require来解决问题:为什么这在H​​eroku环境中是必需的,但在本地主机上却不是?我的印象是Rails自动需要所有gem。app/services/unzipper.rbrequire'zip'#OnlyrequiredforHeroku.Workslocallywithout!class

  4. ruby-on-rails - 仅在某些页面上使用 rails_xss - 2

    我正在使用rails_xss运行Rails2.3.14插入。我有另一个用于创建管理仪表板View的插件。我的问题是rails_xss正在转义我的仪表板插件生成的所有HTML。有没有一种方法可以将rails_xss配置为不转义匹配example.com/admin或基于目录(app/views/admin)或任何类似的页面结果一样吗? 最佳答案 更新仪表板生成插件以使用raw或html_safe进行内容输出可能会更简单。 关于ruby-on-rails-仅在某些页面上使用rails_xss

  5. micropython复现经典单片机项目(二)可视化音频 频谱解析(基本搞定) - 2

    本人是音乐爱好者,从小就特别喜欢那个随着音乐跳动的方框效果,就是这个:arduino上一大把对,我忍你很久了,我就想用mpy做,全网没有,行我自己研究。果然兴趣是最好的老师,我之前有篇博客专门讲音频,有兴趣的可以回顾一下。提到可视化频谱,必然绕不开fft,大学学过这玩意,当时一心玩,老师讲的一个字都么听进去,网上教程简略扫了一下,大该就是把时域转频域的工具,我大mpy居然没有fft函数,奶奶的,先放着。音频信息如何收集?第一种傻瓜式的ADC,模拟转数字,原始粗暴,第二种,I2S库,我之前博客有讲过,数据是PCM编码。然后又去学PCM编码,一学豁然开朗,舒服,以代码为例:audio_in=I2S

  6. Android Studio开发之使用内容组件Content获取通讯信息讲解及实战(附源码 包括添加手机联系人和发短信) - 2

    运行有问题或需要源码请点赞关注收藏后评论区留言一、利用ContentResolver读写联系人在实际开发中,普通App很少会开放数据接口给其他应用访问。内容组件能够派上用场的情况往往是App想要访问系统应用的通讯数据,比如查看联系人,短信,通话记录等等,以及对这些通讯数据及逆行增删改查。首先要给AndroidMaifest.xml中添加响应的权限配置 下面是往手机通讯录添加联系人信息的例子效果如下分成三个步骤先查出联系人的基本信息,然后查询联系人号码,再查询联系人邮箱代码 ContactAddActivity类packagecom.example.chapter07;importandroid

  7. Android 10.0 设置默认launcher后安装另外launcher后默认Launcher失效的功能修复 - 2

    1.前言 在10.0的系统rom定制化开发中,在系统中有多个launcher的时候,会在开机进入launcher的时候弹窗launcher列表,让用户选择进入哪个launcher,这样显得特别的不方便所以产品开发中,要求用RoleManager的相关api来设置默认Launcher,但是在设置完默认Launcher以后,在安装一款Launcher的时候,默认Launcher就会失效,在系统设置的默认应用中Launcher选项就为空,点击home键的时候会弹出默认Launcher列表,让选择进入哪个默认Launcher.所以需要从安装Launcher的流程来分析相关的设置。来解决问题设置默认La

  8. ruby - 仅在特定服务器上调用 delayed_job capistrano 任务 - 2

    我有一个专门用于delayed_job任务的服务器。我想在仅此服务器上启动、停止和重新启动delayed_jobworker。我正在使用delayed_job提供的Capistrano食谱。当我只有1个服务器时,这是我的配置:before"deploy:restart","delayed_job:stop"after"deploy:restart","delayed_job:start"after"deploy:stop","delayed_job:stop"after"deploy:start","delayed_job:start"现在我想让这些Hook仅应用于单独的delayed

  9. ruby - 仅在非 nil 时才分配变量 - 2

    我有@obj.items_per_page,即20一开始,我希望下面的方法仅在many_items时才为其赋值不是nil:deffetch_it_baby(many_items=nil)@obj.items_per_page=many_items使用上面的代码,即使many_items是nil,@obj.items_per_page保持在20.为什么?那是“好的”编码吗?我不应该使用类似的东西吗@obj.items_per_page=many_items||@obj.items_per_page或者有第三种方法吗?我对这两种方式都不太满意。 最佳答案

  10. ruby-on-rails - Rails 3.2 流媒体 - 2

    我正在从Rails3.2进行流式下载(CSV),并且遇到初始页面请求需要很长时间的问题。以下Controller代码说明了我的问题:self.response_body=Enumerator.newdo|y|10_000_000.timesdoy有了上面的内容,响应看起来确实像是流式传输(来自可以支持它的服务器......在我的例子中是Unicorn)。也就是说,在它开始流式传输之前,它挂起的时间比我想要的要长得多。如果我将其更改为以下内容,它会启动得更快:self.response_body=Enumerator.newdo|y|1000.timesdoy我的理解是响应应该从循环的第

随机推荐