当前位置: 首页 > 知识库问答 >
问题:

在Android系统中,当摄像头打开时音频播放会停止吗?

慕震博
2023-03-14

我正在开发一个需要音频/视频聊天的应用程序...我的问题是当我开始捕捉视频时,音频播放完全停止。

    null
    bufferSize = AudioTrack.getMinBufferSize(sampleRateInHz, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT);

    if (bufferSize != AudioTrack.ERROR_BAD_VALUE && bufferSize != AudioTrack.ERROR) {
        audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, this.sampleRateInHz, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT,
                this.bufferSize, AudioTrack.MODE_STREAM);
        if (audioTrack != null && audioTrack.getState() == AudioTrack.STATE_INITIALIZED) {
            Log.i(LOG_TAG, "Audio Track instance created buffer Size : " + this.bufferSize);

            audioTrack.setPositionNotificationPeriod(320);
            audioTrack.setPlaybackPositionUpdateListener(this);

            // init All the jitter variables
            initVariables();
            // short[] tempBuf = shortBuffer;//new short[bufferSize / 2];
            audioTrack.write(shortBuffer, 0, shortBuffer.length);
            audioTrack.write(shortBuffer, 0, shortBuffer.length);
            audioTrack.write(shortBuffer, 0, shortBuffer.length);
            audioTrack.write(shortBuffer, 0, shortBuffer.length);
            audioTrack.write(shortBuffer, 0, shortBuffer.length);
            audioTrack.write(shortBuffer, 0, shortBuffer.length);
            // start playback of the audioTrack
            audioTrack.play();

        } else {
            Log.e(LOG_TAG, "Unble to create AudioTrack instance");
        }
    } else {
        Log.e(LOG_TAG, "Unable to get the minimum buffer size");
    }
}

@Override
    public void onPeriodicNotification(AudioTrack track) {
        try {
            fillAudio(shortBuffer);
            track.write(shortBuffer, 0, Constants.FRAME_SIZE / 2);
        } catch (NullPointerException nex) {
            nex.printStackTrace();
            Log.e(LOG_TAG, "Null Pointer inside periodic notification");
        }}
  1. 用户单击视频聊天按钮,该按钮使用camera.Open()获取相机,设置参数,进行回调,然后使用camera.StartPreview()..
  2. 启动回调

OnTouchListener cameraSurfaceOnTouch=new OnTouchListener(){int x=0;int y=0;int dx=0;int dy=0;布尔移动=false;

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            x = (int) event.getX();
            y = (int) event.getY();
            dx = (int) event.getX() - v.getLeft();
            dy = (int) event.getY() - v.getTop();
            moving = true;

            return true;
        case MotionEvent.ACTION_MOVE:
            if (moving) {
                x = (int) event.getX() - dx;
                y = (int) event.getY() - dy;

                x = Math.max(x, 0);
                x = Math.min(x, getWindowManager().getDefaultDisplay().getWidth() - v.getWidth());

                y = Math.max(y, 0);
                y = Math.min(y, getWindowManager().getDefaultDisplay().getHeight() - v.getHeight());

                v.layout(x, y, x + v.getWidth(), y + v.getHeight());
            }
            return true;
        case MotionEvent.ACTION_UP:
            x = (int) event.getX() - dx;
            y = (int) event.getY() - dy;

            x = Math.max(x, 0);
            x = Math.min(x, getWindowManager().getDefaultDisplay().getWidth() - v.getWidth());

            y = Math.max(y, 0);
            y = Math.min(y, getWindowManager().getDefaultDisplay().getHeight() - v.getHeight());

            // v.layout(x ,y,x + v.getMeasuredWidth() , y
            // +v.getMeasuredHeight());
            moving = false;
            return true;
        }
        // v.invalidate();
        return false;
    }
};

Callback videoPlayerCallBack = new Callback() {
    public void surfaceDestroyed(SurfaceHolder holder) {
        stopCapturerVideo();
        if (converterID != -1 && x264Wrapper != null) {
            x264Wrapper.destroyVideoFormate(converterID);
            converterID = -1;
        }
    }
private void startCapturerVideo() {
        if (m_CameraStatus == false) {
            this.m_CameraStatus = this.videoCapturer.startCamera();
        }
        synchronized (this.m_videoCapturerBufferList) {
            this.m_videoCapturerBufferList.clear();
        }

        byte[] tmp = new byte[10];
        tmp[0] = Constants.VIDEO_SESSION_STARTED;

        short width = 160;
        short height = 120;

        byte[] mIndex = CommonMethods.toByteArray(session.getSelfMeetingIndex());
        byte[] aWidth = CommonMethods.toByteArray(width);
        byte[] aHeight = CommonMethods.toByteArray(height);

        tmp[1] = mIndex[0];
        tmp[2] = mIndex[1];

        tmp[3] = aWidth[0];
        tmp[4] = aWidth[1];

        tmp[5] = aHeight[0];
        tmp[6] = aHeight[1];

        tmp[7] = 0;
        session.add(tmp, 8, 3);

        aWidth = null;
        aHeight = null;
        tmp = null;

        this.stopThread = false;
        this.encodeAndSendThread = new Thread(encodeAndSendRun);
        this.encodeAndSendThread.start();
        this.videoCapturer.startCaptureringVideo();

    }
   public boolean startCaptureringVideo() {
        boolean cameraStatus = true;
        Log.e(LOG_TAG,"startCaptureringVideo called ");
        if(this.mCamera != null)
        {
            try {
//              this.mCamera.setPreviewDisplay(this.videoCaptureViewHolder);
                this.mCamera.startPreview();
                } 
            catch (Throwable e) {
                cameraStatus = false;
                mCamera.release();
                mCamera = null;

                }
        }
        else
        {
            cameraStatus =false;
        }
        return cameraStatus;
    }
  1. onPeriodicNotification()即使停止并释放相机,也不会在步骤2之后再次调用

共有1个答案

锺英彦
2023-03-14

检查AudioManager的OnAudioFocusChange回调:

@Override
public void onAudioFocusChange(int focusChange) {
    if (focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT) {
        //this audio focus change is made when you use the camera
    }
}

当音频焦点改变时,您可能暂停了音频,请检查一下。

 类似资料:
  • 我的应用程序中有一项服务。它发送和接收webservice请求和响应。当我收到来自web服务的特定响应时,我需要停止播放音频/视频文件(媒体文件正在从另一个应用程序播放)。当我完成某个过程时,我需要再次恢复。 注: 在andoid设备中,如果任何2G呼叫停止播放媒体文件,则音乐播放器播放任何音乐,然后当2G呼叫断开时,停止播放媒体文件。我只需要这样做。

  • 函数名称:停止播放音频 函数功能: 停止播放音频 函数方法 media.stop() 返回值 类型 说明 flag boolean true - 正在播放音频,false - 未播放 函数用例 media.playAudio("/sdcard/TouchSprite/res/1.mp3") mSleep(2000) media.stop() flag = media.isPlaying() if

  • 我已经创建了一个android应用程序,使用媒体播放器播放文本到语音文件,但是如果其他音频/视频开始播放,那么我的音频也会播放,即同时播放两个音频。 有没有办法在开始另一个音频/视频之前停止第一个音频。 是否有任何广播接收器会在其他音频开始时被调用。 我用过- layer.play播放音频。 和暂停音频。 任何帮助都将不胜感激。

  • 我正在开发一个音频播放器,它可以在后台播放音频文件。我的问题是,当录像机或视频播放器启动时,我需要暂停音频播放器。 有什么方法可以处理这个任务吗?例如,我有来处理这些调用。当我接到呼叫或wnat呼叫时,我们可以使用呼叫状态暂停播放器。我想为录像机或视频播放器以及相同的场景。当视频/录制开始时,我需要暂停音频播放器。

  • 我有一个情况,我们有一个使用网络视图的Android应用程序。当用户导航到YouTube视频时,它开始播放(带有音频),然后用户使用设备的硬件开关锁定设备,它会继续播放音频。 当应用程序使用设备菜单发送到后台或退出应用程序时,不会发生这种情况。 有人知道为什么会发生这种情况以及如何阻止它吗? 编辑:我刚刚在这里发现了一个类似的、未回答的帖子:应用程序支持视频的后台播放、科尔多瓦问题、谷歌播放拒绝应