- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个播放 MP3 文件的应用程序,这些文件可以在公共(public) URL 上找到。不幸的是,服务器不支持流媒体,但 Android 使用户体验相当可以接受。
除 JellyBean 外,它适用于所有平台。在请求 MP3 时,JB 请求了 10 次 Range-Header。只有在第 10 次尝试之后,它似乎才恢复到原来的行为。 Looks like this already reported issue。
我发现了另一个 SO thread,其中推荐的解决方案是使用 Tranfer-Encoding: chunked header 。但就在下面有一条评论说这不起作用。
目前我无法控制传递上述响应 header ,但在我能够做到这一点之前,我想在客户端搜索替代方案。 (即便如此,我只能返回一个包含从 0 到 Content-Length - 1 的索引的 Content-Range。例如 Content-Range:字节 0-3123456/3123457)。
我尝试做的是通过以下方式在客户端实现伪流:
可以在那里找到执行解码的代码,我只是修改了它以便接收一个 InputStream:
public byte[] decode(InputStream inputStream, int startMs, int maxMs) throws IOException {
ByteArrayOutputStream outStream = new ByteArrayOutputStream(1024);
float totalMs = 0;
boolean seeking = true;
try {
Bitstream bitstream = new Bitstream(inputStream);
Decoder decoder = new Decoder();
boolean done = false;
while (!done) {
Header frameHeader = bitstream.readFrame();
if (frameHeader == null) {
done = true;
} else {
totalMs += frameHeader.ms_per_frame();
if (totalMs >= startMs) {
seeking = false;
}
if (!seeking) {
// logger.debug("Handling header: " + frameHeader.layer_string());
SampleBuffer output = (SampleBuffer) decoder.decodeFrame(frameHeader, bitstream);
if (output.getSampleFrequency() != 44100 || output.getChannelCount() != 2) {
throw new IllegalArgumentException("mono or non-44100 MP3 not supported");
}
short[] pcm = output.getBuffer();
for (short s : pcm) {
outStream.write(s & 0xff);
outStream.write((s >> 8) & 0xff);
}
}
if (totalMs >= (startMs + maxMs)) {
done = true;
}
}
bitstream.closeFrame();
}
return outStream.toByteArray();
} catch (BitstreamException e) {
throw new IOException("Bitstream error: " + e);
} catch (DecoderException e) {
throw new IOException("Decoder error: " + e);
}
}
我请求时间 block 中的解码字节:从 (0, 5000) 开始,所以我首先要播放一个更大的数组,然后我请求跨越一秒的下一个字节数组:(5000, 1000 ), (6000, 1000), (7000, 1000), 等等
解码速度足够快,并且在另一个线程中完成,一旦解码字节数组可用,我就会使用阻塞队列将其写入在另一个线程中播放的 AudioTrack。
问题是播放不流畅,因为音轨中的 block 不是连续的(每个 block 都是连续的,但添加到 AudioTrack 中会导致播放不流畅)。
总结:
谢谢!
最佳答案
看起来您正在尝试开发自己的流媒体类型。这可能会出现 block 状或中断播放,因为您必须尝试连续的信息管道,而不会用完要读取的字节。
基本上,您必须考虑普通流媒体客户端处理的所有情况。例如,有时某些 block 可能会在传输过程中丢失或丢失;有时音频播放可能会 catch 下载; CPU 开始滞后,影响播放;等等等等
如果您想继续沿着这条路走下去,需要研究的是滑动窗口实现,它本质上是一种抽象技术,试图保持网络连接始终活跃和流畅。你应该能够通过谷歌找到几个例子,这里是一个开始的地方:http://en.wikipedia.org/wiki/Sliding_window_protocol
编辑:在解决此问题之前,一种可能对您有帮助的解决方法是将 SDK <16 中的 MediaPlayer.java
和 AudioManager.java
的源代码包含到您的项目,看看是否能解决问题。如果您没有源代码,可以使用 SDK 管理器下载它。
关于Android JellyBean 网络媒体问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13191350/
我正在开发目标 Sdk 17 的应用程序。我当前的设备是 Nexus 7。 我的应用应该没有操作栏,所以我在 Activity 中使用主题Theme.Holo.NoActionBar。 我想在右下角(
当某些应用程序完成安装或更新时,应用程序的启动器图标与安装通知一起放置,如下所示: 如何让我的应用程序的图标在安装完成时也显示出来? 最佳答案 答案是你不知道。您在此处看到的 Google 日历通知来
我正在为 Jellybean、KitKat 和 Lollipop 以及多种不同的设备开发 Android 应用。 在项目开始时,我使用 Jellybean API 库和目标 API“anroid-18
我有一个带有 RelativeLayout 的应用程序,其中包含一个 ProgressBar 和一个 WebView。没有什么复杂的。但是,我遇到了一个非常奇怪的崩溃,我什至没有看到 ANR 对话框。
所以...我阅读了 jellybean 更新说明并看到“Jelly Bean 为付费应用引入了应用加密。” 据我所知,当有人将其 apk 移动到另一台设备时,此服务应该会使应用程序无法使用。 但是非软
我有一个播放 MP3 文件的应用程序,这些文件可以在公共(public) URL 上找到。不幸的是,服务器不支持流媒体,但 Android 使用户体验相当可以接受。 除 JellyBean 外,它适用
源代码在这里:https://github.com/novemberox/NavigationTest此示例的修改版本:http://developer.android.com/training/im
看起来 Google 已经为第三方应用提供了 Google Now 的离线语音识别功能。 the app named Utter 正在使用它. 有没有人看到过如何使用这个离线语音记录来执行简单的语音命
我刚买了一台新的 lenovo A3500 (A7-50) 平板电脑,带有 4.2.2 jellybean 系统。我的电脑在 widows 8 上运行。当我通过 USB 电缆连接我的平板电脑时,com
我有一个 Android 应用程序,它在引用的库中使用 Gson jar。我目前使用的是 2.2.4 版本,我有 2 部手机来测试它。 在 Samsung Galaxy S Advance 2.3.6
我刚刚将我的 Galaxy Tab2 从 ICS 软件更新到 Jelly Bean。我正在开发一个应用程序,我在其中加载一些带有一些 js 文件的 Html,调用一些用 Javascript 文件编写
我想做的是从我的应用程序调用电话并在此通话中打开扬声器。 在 android 4.0 上一切正常,我只是在开始调用 Intent 之前设置了 audiomanager.setSpeakerphoneO
我发现 2.3.4 和 4.2 之间 onNewIntent 调用的行为有所不同。 我有一个 launchMode=singleTask Activity 。根据我对 singleTask 工作原理的
谁能阐明在 JellyBean [Android] 的服务中引入 Isolatedprocess 标签的真正/主要优势是什么?这在框架级别或内核级别是否有利,正如我们所看到的那样,在服务中将 isol
我制作了一个 XML,其中包含一个 TextView,在以下代码中有一个 textAlignement:center:
我们正在使用 phonegap 3.2.2 开发一个 Android 混合应用程序。 在其中一个 html 页面中,我们正在渲染一个“svg”元素,其中包含 svg 中的“path”元素。每个路径元素
这是我正在使用的代码 Intent i = new Intent( android.provider.MediaStore.ACTION_IMAGE_CAPTU
Jellybean 键盘有一个奇怪的问题。当我的用户升级他们的操作系统时,每当他们尝试使用键盘输入数据时,它就是无法输入。期间。 这很奇怪,因为您确实可以专注于文本区域,但在键盘上打字却没有输出。 有
我正在使用 JQM 开发一个移动网站,但在为 Android 版本 4 及更高版本设置正文时遇到问题。地址和主题工作。 这是代码。 var shareEmail = "mailto:"+thisAdd
当 ICS 出现时,引入了几个新的扩展宽度字节码。其中大部分是用于支持巨型 ID 的说明。以下是其中一些新指令,取 self 的 ics/dalvik/opcode-gen/bytecode.txt:
我是一名优秀的程序员,十分优秀!