Android mediaplayer 的两个实例导致奇怪的问题
Two instances of Android mediaplayer cause odd issues
我希望有人能帮助我理解我在使用 Mediaplayer 时遇到的问题 class。
我正在创建一个需要同时播放两个音乐文件的音乐应用程序。在一个用例场景中,我希望能够播放 MP3 曲目,然后启动另一个 MP3 以在第一个之上以不同的音量开始播放。
我发现 Android 媒体播放器 class 提供了此功能,并创建了一个测试应用程序来通过简单地创建两个媒体播放器实例来执行此操作。
例如...
MediaPlayer mMediaPlayer1,mMediaPlayer2;
mMediaPlayer1 = new MediaPlayer();
mMediaPlayer2= new MediaPlayer();
我遇到的问题是在模拟器中它工作正常并且在大多数设备上我尝试它工作正常但是在一些测试设备上当我尝试启动第二个时我得到奇怪的结果mediaplayer/track。
发生的情况是第二个或第一个音轨的音量突然降低到零。我可以看到媒体播放器仍然是 "playing",因为我设置了几个进度条来跟踪它的进度,但你听不到任何声音。
我在 OnePlus One 和 OnePlus X 上都看到过这个 phone。在我的 Asus 平板电脑和 Smasung A3 phone 上它运行良好。它与 OS 版本无关,因为我在 4.4.2、5、6 和 7 上尝试过,结果好坏参半。它肯定似乎与硬件有关。
我也看到了描述此问题的相关帖子,但 none 到目前为止已经回答了导致此问题的原因。
任何人都可以对此进行解释或阐明问题吗?哪怕只是为了理解我做的事情的局限性?
仅供参考 - 我看过 Soundpool,但无法使用它,因为我使用的剪辑大于 1Mb。
提前致谢...
为了实现混合音乐的目标,您可以开发自己的 "mixer",它将处理原始音频数据。
步骤是:
- 通过MediaExtractor
从音乐文件中提取编码的音频数据
- 通过Decoder (MediaCodec)
解码这些字节缓冲区
- 将来自第一个音频的一个解码缓冲区与来自第二个音频的一个解码缓冲区混合以获得一个混合缓冲区,here is algorithm
- 通过AudioTrack
播放混合缓冲区
这里有很多工作,但它可以在任何地方工作!
感谢您的建议。最终找到了绕过它的方法。如果您使用较新的 AudioAttributes 选项(API 21 及更高版本)并设置 FLAG_AUDIBILITY_ENFORCED 标志,那么它似乎会强制我遇到问题的设备播放流....感谢您的关注!
我希望有人能帮助我理解我在使用 Mediaplayer 时遇到的问题 class。
我正在创建一个需要同时播放两个音乐文件的音乐应用程序。在一个用例场景中,我希望能够播放 MP3 曲目,然后启动另一个 MP3 以在第一个之上以不同的音量开始播放。
我发现 Android 媒体播放器 class 提供了此功能,并创建了一个测试应用程序来通过简单地创建两个媒体播放器实例来执行此操作。
例如...
MediaPlayer mMediaPlayer1,mMediaPlayer2;
mMediaPlayer1 = new MediaPlayer();
mMediaPlayer2= new MediaPlayer();
我遇到的问题是在模拟器中它工作正常并且在大多数设备上我尝试它工作正常但是在一些测试设备上当我尝试启动第二个时我得到奇怪的结果mediaplayer/track。
发生的情况是第二个或第一个音轨的音量突然降低到零。我可以看到媒体播放器仍然是 "playing",因为我设置了几个进度条来跟踪它的进度,但你听不到任何声音。
我在 OnePlus One 和 OnePlus X 上都看到过这个 phone。在我的 Asus 平板电脑和 Smasung A3 phone 上它运行良好。它与 OS 版本无关,因为我在 4.4.2、5、6 和 7 上尝试过,结果好坏参半。它肯定似乎与硬件有关。
我也看到了描述此问题的相关帖子,但 none 到目前为止已经回答了导致此问题的原因。
任何人都可以对此进行解释或阐明问题吗?哪怕只是为了理解我做的事情的局限性?
仅供参考 - 我看过 Soundpool,但无法使用它,因为我使用的剪辑大于 1Mb。
提前致谢...
为了实现混合音乐的目标,您可以开发自己的 "mixer",它将处理原始音频数据。
步骤是:
- 通过MediaExtractor 从音乐文件中提取编码的音频数据
- 通过Decoder (MediaCodec) 解码这些字节缓冲区
- 将来自第一个音频的一个解码缓冲区与来自第二个音频的一个解码缓冲区混合以获得一个混合缓冲区,here is algorithm
- 通过AudioTrack 播放混合缓冲区
这里有很多工作,但它可以在任何地方工作!
感谢您的建议。最终找到了绕过它的方法。如果您使用较新的 AudioAttributes 选项(API 21 及更高版本)并设置 FLAG_AUDIBILITY_ENFORCED 标志,那么它似乎会强制我遇到问题的设备播放流....感谢您的关注!