我目前正在尝试最小化简单应用程序的音频延迟:
我在PC上有一个视频,我正在通过RTP将视频的音频传输到移动客户端.使用非常相似的缓冲算法,我可以在iOS上实现90ms的延迟,但在Android上可以实现±180ms的可怕延迟.
然而,在阅读了一下后,我发现了这篇文章,其中指出:
自Android 4.1/4.2以来,在某些设备中可以使用低延迟音频.
使用libpd可以实现低延迟音频,libpd是Android的纯数据库.
我有两个问题,与这两个陈述直接相关:
我在哪里可以找到有关Jellybean中新的低延迟音频的更多信息?这是我能找到的全部,但它缺乏具体的信息.如果这些更改对我来说是透明的,或者是否有一些新的类/ API调用我应该实现我注意到我的应用程序中的任何更改?我正在使用AudioTrack API,我甚至不确定它是否应该从这种改进中获益,或者我是否应该研究其他一些音频播放机制.
我应该考虑使用libpd吗?在我看来,这是我实现更低延迟的唯一机会,但由于我一直认为PD是一个音频合成实用程序,它是否真的适合于只从网络流中抓取帧并播放它们的项目?我不是在做任何合成.我跟踪错误的踪迹吗?
另外需要注意的是,在有人提到OpenSL ES之前,本文非常清楚地表明使用它时不应期望延迟有所改善:
"由于OpenSL ES是本机C API,调用OpenSL ES的非Dalvik应用程序线程没有与Dalvik相关的开销,例如垃圾收集暂停.但是,除此之外,使用OpenSL ES没有额外的性能优势.特别是,使用OpenSL ES不会导致比平台通常提供的更低的音频延迟,更高的调度优先级等."
我有一个字节[](从服务中下载),我的MP3文件,我想发挥它我的设备类似上你可以怎么玩的文件:
MediaPlayer mp = new MediaPlayer();
mp.setDataSource(PATH_TO_FILE);
mp.prepare();
mp.start();
Run Code Online (Sandbox Code Playgroud)
但我似乎无法找到办法.我不介意将文件保存到手机然后播放.我该如何播放文件,或下载然后播放?
我需要从我的 firebase 存储 gs://fir-b9532.appspot.com/songs/song1.mp3 下载一个 mp3 文件并将其播放到我的 android 应用程序中。我想将 mp3 文件临时存储在我设备的内存中,用媒体播放器播放,然后播放一首新歌。
我按照 firebase 手册编写了以下简单代码,但似乎不起作用。任何想法出了什么问题?
package com.example.andreaskonstantakos.firebase;
import android.media.MediaPlayer;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.firebase.storage.FirebaseStorage;
import com.google.firebase.storage.StorageReference;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FirebaseStorage storage = FirebaseStorage.getInstance();
StorageReference storageRef = storage.getReference();
StorageReference songsRef = storageRef.child("songs");
StorageReference song1Ref = storageRef.child("songs/song1.mp3");
final long ONE_MEGABYTE = 1024 * 1024;
song1Ref.getBytes(ONE_MEGABYTE).addOnSuccessListener(new OnSuccessListener<byte[]>() {
@Override
public void onSuccess(byte[] bytes) {
// Data …Run Code Online (Sandbox Code Playgroud)