gpt4 book ai didi

android - 在 Android 中打开相机时音频播放停止?

转载 作者:行者123 更新时间:2023-12-03 00:04:50 25 4
gpt4 key购买 nike

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

技术说明
我使用 AudioTrack 类和 AudioTrack.OnPlaybackPositionUpdateListener 进行音频播放。
我使用 Camera 和 Camera.PreviewCallBack 进行视频录制。

现在只要相机启动,AudioTrack 类的回调就会停止工作。我能做些什么来处理这个问题?我有 HTC 的设备,它有 Android2.2。

编辑
由于我不能在这里发布完整的代码......(我无权访问视频模块的代码),
我在这里列出场景:-

  • 音频聊天已经开始,音频正在播放,这意味着 onPeriodicNotification() 被正确调用..

  • 公共(public)无效开始(){
        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");
    }}

    fillAudio() 是一个填充缓冲区的函数...
  • 用户点击视频聊天按钮,使用 Camera.open() 获取摄像头,设置参数,回调,稍后使用 camera.startPreview() 启动回调..

  • OnTouchListener cameraSurfaceOnTouch = new OnTouchListener() {
    诠释 x = 0;
    整数 y = 0;
    int dx = 0;
    int dy = 0;
    bool 移动=假;
        @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;
    }
  • onPeriodicNotification()即使我停止并释放相机,在第 2 步之后也不会再次调用。

  • 这可能是什么原因,

    最佳答案

    查看 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
    }
    }

    当音频焦点改变时,也许你正在暂停音频,检查一下。

    关于android - 在 Android 中打开相机时音频播放停止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11625565/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com