标签: audio-streaming

在Android上通过TCP套接字传输音频

我通过套接字从C服务器传输麦克风输入.我知道流是有效的,因为它与C客户端有关,我在Android客户端上获得了正确的值.

我正在播放1024 flatarray.一个浮点数是4个字节.所以我得到了一个每帧4096字节的传入流.我从这个字节中获取浮点数,我知道这些浮点数是我发送的,所以该部分应该可以工作.

现在,我希望使用AudioTrack将该流直接传输到手机扬声器.我试着输入我直接收到的字节:只是噪音.我试图将它强制转换为字节数组,仍然是相同的.我试图把那个浮点数简化(因为AudioTrack需要字节或短).我可能得到的东西可能是我的麦克风输入(敲门),但非常沙哑,而且极其迟钝.我会理解帧之间是否存在延迟,但我甚至无法获得一个清晰的声音.然而,我可以清楚地输出一个我本地产生的声音,然后放入那个短小的声音.现在我想知道我的代码中是否有一些问题你可以看到,因为我没有看到它们.

我正在做的是:我在一个字节数组中放入4个字节.我把浮子拿出来了.一旦我在我的浮动数组中得到一个帧(我用bool控制它,不好,但它应该工作)我把它放在我的短片中,让audiotrack播放它.这种双重演员可能会很慢,但我这样做是因为它最接近我实际的输入.

编辑: 我通过比较浮点数来检查结束,它们具有介于-1和1之间的正确值,并且与我发送的值相同.由于我在转换为浮动时不改变endianess,我不明白为什么直接将4096字节数组转发到AudioTrack也不起作用.多线程可能有问题,但我不知道它可能是什么.

编辑2: 我发现了一个小问题 - 我在1023处重置了j.但是那个丢失的浮点数应该不是问题所在.除了那之外我做的是将来自套接字的流的方法放在另一个线程中,而不是在异步任务中调用它.这使它工作,我现在能够理解麦克风的声音.质量仍然很差 - 代码中可能有这样的原因吗?我也有大约10秒的延迟.只有大约半秒钟是由WLAN引起的,所以我想知道它是否可能是代码故障.任何进一步的想法表示赞赏

编辑3:我玩了代码并在评论中实现了一些greenapps的想法.使用新的线程结构,我面临着没有任何声音的问题.像一样.我不知道怎么可能,所以我换回来了.我尝试使线程更轻量级的其他东西没有任何影响.我有一个延迟,我的质量很差(我可以识别敲门声,但我无法理解声音).我认为我的转换可能有问题,所以我把我从套接字收到的字节直接放在AudioTrack中 - 只有丑陋的脉冲静态噪音.现在我更加困惑,因为这个确切的流仍然适用于C客户端.如果我找到解决方案,我会报告,但仍然欢迎任何帮助.

编辑4 我应该添加,我可以从另一个Android应用程序播放麦克风输入,我直接将该输入作为字节发送(我将排除浮动播放的东西,并将我直接接收的字节放入我的播放器代码中的audioTrack).
它也发生在我身上,这可能是一个问题,由C服务器流式传输的所述floatarray来自64位机器而手机是32位.这可能是一个问题,即使我只是将浮动数据传输为4个字节?或者,我的另一个想法:我收到的字节的基础数字格式是浮点数.AudioTrack期望什么格式?即使只放入字节 - 我是否需要将该浮点数转换为int并将其转换回字节或其他内容?

新代码:

public class PCMSocket {

AudioTrack audioTrack;
boolean doStop = false;
int musicLength = 4096;
byte[] music;
Socket socket;
short[] buffer = new short[4096];
float[] fmusic = new float[1024];
WriteToAudio writeThread;
ReadFromSocket readThread;


public PCMSocket()
{

}

public void start()
{
    doStop = false;
    readThread = new ReadFromSocket();
    readThread.start();
}

public class ReadFromSocket extends Thread
{       
    public void …
Run Code Online (Sandbox Code Playgroud)

java sockets android audio-streaming audiotrack

15
推荐指数
1
解决办法
8280
查看次数

在iOS客户端上使用HTTP Live Streaming播放音频文件流,而不会将UI丢失到Quick Time

我有一个HTTP Live流媒体服务器设置,提供分段的mp3音频内容(URL指向playlist.m3u8索引文件).我需要构建一个iOS客户端应用程序来使用此音频流,而无需使用任何标准的Apple控件/ UI.它应该在后台播放流,我想使用我自己的自定义UI来提供控件.

由于内容纯粹是音频,我不想在接管UI时使用MPMoviePlayerController类.我尝试过使用AVAudioPlayer,虽然它不适用于网络流,但不出所料地无法使用错误代码"-43"播放:NSOSStatusErrorDomain.

我还尝试创建一个高度和宽度为1像素的UIWebView,并将其指向服务器上的playlist.m3u8文件.这很有效,但不幸的是我仍然失去了UI,因为UIWebView只是将播放的任务委托给QuickTime播放器,该播放器在我的应用程序中以iOS 3.xx设备全屏启动.

基本上,在我看来,Apple没有提供任何客户端API来消费HTTP Live Streaming 音频流,开发人员被迫放弃用户界面到QuickTime播放器,该播放器播放带有QT徽标的流播放屏幕.ughh ...

我很想知道是否有人有建议来帮我解决上述问题.否则,我的计划B是放弃HTTP Live Streaming并使用着名的Matt Gallagher 经典流媒体实现.但是,我有点担心苹果指南明确暗示,对于预计会通过蜂窝网络(我的应用程序)发送大量音频或视频内容的应用程序需要使用HTTP Live流媒体.这是否意味着我的计划B实施容易被Apple拒绝?有什么方法可以绕过这个指南吗?

iphone audio-streaming http-live-streaming

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

Android中的实时音频录制和播放以及线程和回调处理

我想要录制现场音频并播放它.就UI而言,应用程序只有三个按钮:一个用于开始录制和流式传输,一个用于播放预录制文件,最后一个用于停止当前任务(录制/播放).为此,我分别使用AudioRecordAudioTrack类进行录制和播放.我的程序看起来像....

/***@author amit**/

public class AudioRecorder extends Activity {
    private String LOG_TAG = null;

    /* variables which are required to generate and manage the UI of the App */
    // private RecordButton mRecordButton = null;
    private Button recordBtn, stopBtn, playBtn;

    /*
     * variables which are required for the actual functioning of the recording
     * and playing
     */
    private AudioRecord recorder = null;
    private AudioTrack player = null;
    private AudioManager audioManager = null;
    private int recorderBufSize, recordingSampleRate; …
Run Code Online (Sandbox Code Playgroud)

android audio-recording audio-streaming audiorecord

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

Android 2.2 MediaPlayer可以正常使用一个SHOUTcast URL,但不能与另一个一起使用

请参阅我用于流式传输shoutcast流的代码,它适用于一个URL但不适用于另一个URL.

这个工作:

Uri myUri = Uri.parse("http://fr3.ah.fm:9000/");
Run Code Online (Sandbox Code Playgroud)

但不是这个:

Uri myUri =  Uri.parse("http://someOtherURL");
Run Code Online (Sandbox Code Playgroud)

SimpleMusicStream.java

import android.app.Activity;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class SimpleMusicStream extends Activity implements
  MediaPlayer.OnCompletionListener, MediaPlayer.OnPreparedListener,
  MediaPlayer.OnErrorListener, MediaPlayer.OnBufferingUpdateListener {

 private String TAG = getClass().getSimpleName();
 private MediaPlayer mp = null;

 private Button play;
 private Button pause;
 private Button stop;

 @Override
 public void onCreate(Bundle icicle) {
  super.onCreate(icicle);
  setContentView(R.layout.main);

  play = (Button) findViewById(R.id.play);
  pause = (Button) findViewById(R.id.pause);
  stop = (Button) findViewById(R.id.stop);

  play.setOnClickListener(new View.OnClickListener() …
Run Code Online (Sandbox Code Playgroud)

android uri shoutcast audio-streaming media-player

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

从Android应用程序流式传输音频到任何可用的扬声器,如A2DP,汽车扬声器等

从我的Android应用程序,我想将音频流式传输到A2DP扬声器,docking扬声器或car扬声器等任何可用的扬声器.

为此,我想使用蓝牙连接并通过蓝牙连接流...

我看到以下链接

关于android如何从a2dp重新路由音频

setBluetoothA2dpOn(boolean on)

Android 2.3:如何从SCO切换到A2DP以获得功能强大的蓝牙扬声器?

但到处都是我发现的相同..即

public void setBluetoothA2dpOn (boolean on)

This method is deprecated.
Do not use. 
Run Code Online (Sandbox Code Playgroud)

请指导我如何做到这一点..或建议是否可以使用其他方式完成..任何帮助/建议表示赞赏.

编辑:

清单中的许可:

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

代码:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    layout = (RelativeLayout) findViewById(R.id.layout);
    text = (TextView) findViewById(R.id.editText1);
    scoSwitch = (ToggleButton) findViewById(R.id.switch1);
    try {
        mp1 = MediaPlayer.create(this, R.raw.jc_cm);
        mp2 = MediaPlayer.create(this, R.raw.rp);
        amanager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
        //amanager.setBluetoothA2dpOn(true);
                } catch (IllegalArgumentException e) {
        // TODO Auto-generated catch block …
Run Code Online (Sandbox Code Playgroud)

android docking audio-streaming bluetooth-sco

13
推荐指数
1
解决办法
7509
查看次数

流音频延迟

我正在尝试通过服务器传输音频.我已经设置了所有内容,并且它可以正常录制和播放静态音频,但是当我尝试流式传输音频时,播放方面会有延迟.

我做了谷歌搜索,但找不到正确的方法.我正在使用AudioRecord和Audiotrack Android媒体API来发送和接收音频数据.谁能告诉我如何处理这种延迟?

我在GOOGLE GROUP上添加了我的代码以获得清晰的图片.

我试过这种方式,将5块音频数据保存在一个缓冲区中,该缓冲区通过服务器并在填充5块数据时播放并再次获取下5块音频数据并填充它直到1024字节数据(它写入录音带和播放方法被称为).这也有延迟,任何其他解决方案?

android audio-recording audio-streaming audio-player android-mediaplayer

13
推荐指数
1
解决办法
1808
查看次数

流式传输音频文件并缓存它

我想流式传输一个音频mp3文件然后通过Android媒体播放器播放它还想缓存这个文件,这样媒体播放器就不必为最近播放的曲目流播放了.

我尝试过使用prepareAsync方法,但它不允许我访问缓冲区内容,因此我决定自己流式传输音频文件,然后将其传递给媒体播放器进行播放.我已经通过这篇文章实现这一点,但这种方法存在一个问题,即在将文件传输到媒体播放器时,它会进入错误模式,导致我的播放器表现不一致.

当媒体播放器进入其错误模式时,它不会自动退出,因此我被迫创建一个新的媒体播放器,然后重新提供下载的文件,这种解决方法会导致用户在播放歌曲时遇到不希望的暂停.

那么,是否有人改进了上述链接中给出的代码版本?或者他们是否知道这个问题的更好的解决方案,或者实际上有一个用于在Android中传输音频文件的库?

谢谢

android caching audio-streaming android-mediaplayer

13
推荐指数
1
解决办法
5439
查看次数

了解网络音频中的getByteTimeDomainData和getByteFrequencyData

无论我在哪里,这两种方法的文档都非常通用.我想知道我正在查看我从每个方法得到的返回数组到底是什么.

对于getByteTimeDomainData,每次传递覆盖的时间段是多少?我相信大多数的oscopes每次传球覆盖32毫秒.这也包括在内吗?对于实际的元素值本身,范围似乎是0 - 255.这相当于-1 - +1伏?

对于getByteFrequencyData,所覆盖的频率基于采样率,因此每个索引都是实际频率,但实际元素值本身又如何呢?是否有一个dB范围等于返回数组中返回的值?

html5 audio-streaming html5-audio web-audio-api

13
推荐指数
3
解决办法
3845
查看次数

Android设备作为A2DP配置文件的接收器

基本上,我想现在要做的是使用Android设备作为A2DP接收器和配对成立时,Android的播放声音是从发射机接收.我担心如果我使用STP配置文件,可能会导致流式传输延迟.所以,我想使用A2DP,但是这可能使用Android设备作为A2DP的接收器吗?怎么做?

streaming android bluetooth audio-streaming a2dp

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

如何判断Google上的操作流式传输音频?

我正在编写一个与Google Actions合作的应用.唯一令人遗憾的是,我无法找到有关如何形成我的回复的任何信息,以便Google将流式传输来自给定网址的音频.谷歌甚至支持这个吗?

我已经在Alexa上编写了相同的应用程序,而在Alexa上,您所要做的就是返回一个音频项目(令牌,URL,播放命令),Alexa将开始流式传输.

我应该提到我不使用API​​.AI,但我只是使用Actions SDK并使用C#在Asure上托管我的Web服务.

那么,底线...如何通过Actions SDK格式化响应以将MP3文件流式传输到Google Home?

audio-streaming actions-on-google google-home

13
推荐指数
2
解决办法
4825
查看次数