我通过套接字从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) 我有一个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拒绝?有什么方法可以绕过这个指南吗?
我想要录制现场音频并播放它.就UI而言,应用程序只有三个按钮:一个用于开始录制和流式传输,一个用于播放预录制文件,最后一个用于停止当前任务(录制/播放).为此,我分别使用AudioRecord和AudioTrack类进行录制和播放.我的程序看起来像....
/***@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) 请参阅我用于流式传输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应用程序,我想将音频流式传输到A2DP扬声器,docking扬声器或car扬声器等任何可用的扬声器.
为此,我想使用蓝牙连接并通过蓝牙连接流...
我看到以下链接
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) 我正在尝试通过服务器传输音频.我已经设置了所有内容,并且它可以正常录制和播放静态音频,但是当我尝试流式传输音频时,播放方面会有延迟.
我做了谷歌搜索,但找不到正确的方法.我正在使用AudioRecord和Audiotrack Android媒体API来发送和接收音频数据.谁能告诉我如何处理这种延迟?
我在GOOGLE GROUP上添加了我的代码以获得清晰的图片.
我试过这种方式,将5块音频数据保存在一个缓冲区中,该缓冲区通过服务器并在填充5块数据时播放并再次获取下5块音频数据并填充它直到1024字节数据(它写入录音带和播放方法被称为).这也有延迟,任何其他解决方案?
android audio-recording audio-streaming audio-player android-mediaplayer
我想流式传输一个音频mp3文件然后通过Android媒体播放器播放它我还想缓存这个文件,这样媒体播放器就不必为最近播放的曲目流播放了.
我尝试过使用prepareAsync方法,但它不允许我访问缓冲区内容,因此我决定自己流式传输音频文件,然后将其传递给媒体播放器进行播放.我已经通过这篇文章来实现这一点,但这种方法存在一个问题,即在将文件传输到媒体播放器时,它会进入错误模式,导致我的播放器表现不一致.
当媒体播放器进入其错误模式时,它不会自动退出,因此我被迫创建一个新的媒体播放器,然后重新提供下载的文件,这种解决方法会导致用户在播放歌曲时遇到不希望的暂停.
那么,是否有人改进了上述链接中给出的代码版本?或者他们是否知道这个问题的更好的解决方案,或者实际上有一个用于在Android中传输音频文件的库?
谢谢
无论我在哪里,这两种方法的文档都非常通用.我想知道我正在查看我从每个方法得到的返回数组到底是什么.
对于getByteTimeDomainData,每次传递覆盖的时间段是多少?我相信大多数的oscopes每次传球覆盖32毫秒.这也包括在内吗?对于实际的元素值本身,范围似乎是0 - 255.这相当于-1 - +1伏?
对于getByteFrequencyData,所覆盖的频率基于采样率,因此每个索引都是实际频率,但实际元素值本身又如何呢?是否有一个dB范围等于返回数组中返回的值?
基本上,我想现在要做的是使用Android设备作为A2DP接收器和配对成立时,Android的播放声音是从发射机接收.我担心如果我使用STP配置文件,可能会导致流式传输延迟.所以,我想使用A2DP,但是这可能使用Android设备作为A2DP的接收器吗?怎么做?
我正在编写一个与Google Actions合作的应用.唯一令人遗憾的是,我无法找到有关如何形成我的回复的任何信息,以便Google将流式传输来自给定网址的音频.谷歌甚至支持这个吗?
我已经在Alexa上编写了相同的应用程序,而在Alexa上,您所要做的就是返回一个音频项目(令牌,URL,播放命令),Alexa将开始流式传输.
我应该提到我不使用API.AI,但我只是使用Actions SDK并使用C#在Asure上托管我的Web服务.
那么,底线...如何通过Actions SDK格式化响应以将MP3文件流式传输到Google Home?
audio-streaming ×10
android ×7
a2dp ×1
audio-player ×1
audiorecord ×1
audiotrack ×1
bluetooth ×1
caching ×1
docking ×1
google-home ×1
html5 ×1
html5-audio ×1
iphone ×1
java ×1
media-player ×1
shoutcast ×1
sockets ×1
streaming ×1
uri ×1