标签: audiotrack

在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
查看次数

如何判断AudioTrack对象何时播放?

我正在尝试使用AudioTrack该类在Android中播放PCM文件.我可以让文件播放得很好,但我无法可靠地判断播放何时完成.AudioTrack.getPlayState说播放在播放完毕后停止了.我遇到了同样的问题AudioTrack.setNotificationMarkerPosition,我很确定我的标记设置在文件的末尾(虽然我不完全确定我做得对).同样,当getPlaybackHeadPosition文件结束并且已停止递增时,播放将继续.有人可以帮忙吗?

java android audiotrack

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

android中的帧到毫秒转换

在Android中,AudioTrack类的getPlaybackHeadPosition()方法返回以帧表示的播放头位置,以毫秒为单位的等效值是多少?

android audiotrack

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

使用Android AudioTrack的缓冲区

我想弄清楚如何使用AudioTrack的缓冲区来有效地传输音乐.我知道你可以使用write方法对音频进行排队,但是一旦音频排队,你怎么知道剩下多少以及使用/播放了多少?对不起,如果这是一个基本问题.我理解缓冲区的概念我不知道怎么写一个,特别是使用AudioTrack.

android audiotrack

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

如何在WebRTC中的MediaStream中添加Track

我正在使用webrtc与同行之间进行通信.我不想为旧生成的流添加新轨道,因为我不想在音频通信期间为用户提供切换麦克风的功能.我正在使用的代码是,

让"pc"成为通过其进行音频通信的peerConnection对象,"newStream"是使用新选择的麦克风设备从getUserMedia函数获得的新生成的MediaStream.

            var localStreams = pc.getLocalStreams()[0];
            localStreams.removeTrack(localStreams.getAudioTracks()[0]);


            var audioTrack = newStream.getAudioTracks()[0];
            localStreams.addTrack(audioTrack);
Run Code Online (Sandbox Code Playgroud)

他们以任何方式新添加的曲目开始到达另一个先前连接的同伴而不再向他提供整个SDP吗?

在交换媒体设备的情况下使用的优化方式是什么,即在对等体之间已经建立连接的情况下使用麦克风?

microphone audiotrack webrtc mediastream

11
推荐指数
1
解决办法
8618
查看次数

如何确定Android上的音频延迟(AudioTrack)?

我有一个应用程序,我使用AudioTrack流媒体模式播放动态生成的音频.该应用程序不必立即响应输入,因此延迟问题不会打扰我的程序的那一面.

问题是我有一个动画需要与音频尽可能精确地"同步",似乎不同的设备在AudioTrack停止阻止write()呼叫和要求更多数据之间有不同的时间量,并且从扬声器播放音频.

我目前的解决方案让我大部分都在那里 - 我计算AudioTrack到目前为止我传入的帧数,并将其与之进行比较getPlaybackHeadPosition().它看起来基本上像:

long currentTimeInFrames = 0;
while(playingAudio) {
  currentTimeInFrames += numberOfFramesToWrite;
  long delayInFrames = (currentTimeInFrames - audioTrack.getPlaybackHeadPosition());
  audioTrack.write(frameBuffer,0,sampleSize);
  doAnimationAfterDelay(delayInFrames);
}
Run Code Online (Sandbox Code Playgroud)

但是,仍然存在一些getPlaybackHeadPosition()似乎没有因设备而异的延迟.

有没有办法在系统中轮询AudioTrack的延迟?

java audio android audiotrack

10
推荐指数
2
解决办法
3987
查看次数

Android MediaCodec不解码所有输入缓冲区

在Android 4.4.2中,我MediaCodec用来解码mp3文件.我正在使用queueInputBuffer()输入mp3编码帧排队并dequeueOutputBuffer()获得解码帧.但是解码器从第8帧开始提供解码输出(基于bufferInfo.presentationTimeUs)并跳过最初的7帧.此方案仅针对少数流而不针对所有流发生.此外,这种行为在许多运行中都是一致的.

我想要所有帧的解码输出,我不希望任何帧被跳过.任何人都可以帮助我理解为什么帧被跳过?我保证流不会被破坏.因为我要INFO_TRY_AGAIN到第7帧,当`dequeueOutputBuffer'返回有效的缓冲区索引时,它的呈现时间总是第8帧.

以下是排队代码:

Log.e(TAG, "audptOffset = "+audptOffset+"input PT = "+audpt);
                audcodec.queueInputBuffer(audInbufIndex, 0, audchunkSize, audpt, 0);
Run Code Online (Sandbox Code Playgroud)

以下是我如何调用dequeue并写入AudioTrack:

if(!audoutputDone ){
                if(!waitForAudioRelease){
                    auoutBufIndex  = audcodec.dequeueOutputBuffer(auinfo, 100);
                    Log.e(TAG, "Output PT = " + auinfo.presentationTimeUs+"auoutBufIndex = "+auoutBufIndex);
                }
                if (auoutBufIndex >= 0) {
                    waitForAudioRelease = true;
                } else if (auoutBufIndex == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED) {
                    auddecOutBufArray = audcodec.getOutputBuffers();
                } else if (auoutBufIndex == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {
                    MediaFormat newFormat = audcodec.getOutputFormat();
                    int sampleRate1 = newFormat.getInteger(MediaFormat.KEY_SAMPLE_RATE);
                    int …
Run Code Online (Sandbox Code Playgroud)

android audiotrack mediacodec

10
推荐指数
1
解决办法
727
查看次数

如何将.pcm文件转换为.wav或.mp3文件?

我目前正在开发一个具有录音和播放功能的Android应用程序.我是处理音频的新手,我在编码和格式方面遇到了一些麻烦.

我能够在我的应用程序中录制和播放音频,但在导出时我无法重现音频.我找到的唯一方法是导出我的.pcm文件并使用Audacity进行转换.

这是我记录音频的代码是:

private Thread recordingThread 
private AudioRecord mRecorder;
private boolean isRecording = false;

private void startRecording() {

    mRecorder = new AudioRecord(MediaRecorder.AudioSource.MIC,
            Constants.RECORDER_SAMPLERATE, Constants.RECORDER_CHANNELS,
            Constants.RECORDER_AUDIO_ENCODING, Constants.BufferElements2Rec * Constants.BytesPerElement);

    mRecorder.startRecording();
    isRecording = true;

    recordingThread = new Thread(new Runnable() {
        public void run() {
            writeAudioDataToFile();
        }
    }, "AudioRecorder Thread");
    recordingThread.start();
}

private void writeAudioDataToFile() {
    // Write the output audio in byte

    FileOutputStream os = null;
    try {
        os = new FileOutputStream(mFileName);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }

    while (isRecording) { …
Run Code Online (Sandbox Code Playgroud)

android pcm audiotrack

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

Android:使用ffmpeg播放带有AudioTrack的MP3文件

我在我的项目中集成了ffmpeg lib,我也可以获取媒体文件的信息.但现在我必须使用ffmpeg lib在android中使用AudioTrack类播放mp3文件.

为此,我必须将字节缓冲区传递给AudioTrack,但我不知道如何从ffmpeg获取字节缓冲区并将其与AudioTrack一起使用.我也希望立即播放文件.

这是我在java中的音轨代码:

AudioTrack track;
bufferSize = AudioTrack.getMinBufferSize(44100,AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT)
track = new AudioTrack(AudioManager.STREAM_MUSIC, 44100, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSize, mode);

//Play audio clip
track.play();

while(stream_is_over){
//Copy the decoded raw buffer from native code to "buffer" .....
............
track.write(buffer, 0, readBytes);
}
Run Code Online (Sandbox Code Playgroud)

任何人都可以给我工作代码播放带音轨的mp3文件.我搜索了很多,但没有找到任何正确的答案.

android ffmpeg audiotrack

9
推荐指数
1
解决办法
5974
查看次数

AudioTrack:play()调用未初始化的AudioTrack

我正在尝试使用AudioTrack课程.基本上,我的应用程序必须在用户触摸屏幕上的特定对象时生成声音.我用这个例子作为指导.
我的应用程序似乎应该工作,但通常在触摸屏幕约一分钟后崩溃:

07-02 20:40:53.459: E/AndroidRuntime(11973): FATAL EXCEPTION: Thread-10
07-02 20:40:53.459: E/AndroidRuntime(11973): java.lang.IllegalStateException: play() called on uninitialized AudioTrack.
07-02 20:40:53.459: E/AndroidRuntime(11973):    at android.media.AudioTrack.play(AudioTrack.java:824)
07-02 20:40:53.459: E/AndroidRuntime(11973):    at com.mysounds_experimental.SoundThread.playSound(SoundThread.java:108)
07-02 20:40:53.459: E/AndroidRuntime(11973):    at com.mysounds_experimental.SoundThread.run(SoundThread.java:69)
Run Code Online (Sandbox Code Playgroud)

来自生成声音的类的方法

public void initAudioTrack() {
        int bufferSize = AudioTrack.getMinBufferSize(sampleRate
                , AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT);

        audioTrack = new AudioTrack(
                AudioManager.STREAM_MUSIC
                , sampleRate
                , AudioFormat.CHANNEL_CONFIGURATION_MONO
                , AudioFormat.ENCODING_PCM_16BIT
                , bufferSize
                , AudioTrack.MODE_STREAM);
    }

   private void playSound(){
            audioTrack.write(generatedSnd, 0, numSamples);
            audioTrack.play();
        }

public void stopPlaying() {
    audioTrack.flush();
    audioTrack.stop(); 
    audioTrack.release();
}

@Override
    public …
Run Code Online (Sandbox Code Playgroud)

android illegalstateexception audiotrack

9
推荐指数
1
解决办法
8994
查看次数