[置顶] v310 摄像头调试笔记---QQ视频对方发现颜色不对, 有红块, 并且本地预览闪烁的问题

问题1: QQ视频对方发现颜色不对, 有红块。

解决:  通过kernel打印CIOCTRL和CITRGFMT, 发现本机录像时用的是NV12格式,QQ视频时用的却是YUV420格式(yv12), 关于这两种格式网上有详细介绍。所以在HAL层修改如下即可解决:

void CameraHardwareSec::initDefaultParameters(int cameraId)
....

    parameterString = CameraParameters::PIXEL_FORMAT_YUV420P;
    parameterString.append(",");
    parameterString.append(CameraParameters::PIXEL_FORMAT_YUV420SP);
    p.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS, parameterString.string());
   
    //p.setPreviewFormat(CameraParameters::PIXEL_FORMAT_YUV420P);
    p.setPreviewFormat(CameraParameters::PIXEL_FORMAT_YUV420SP);  //这个就是NV12格式

 

问题2: 本地预览闪烁的问题

QQ视频的数据是通过回调函数得到的, 如下:

previewThread()中的

    // Notify the client of a new frame.
    if ((mMsgEnabled & CAMERA_MSG_PREVIEW_FRAME) && mPreviewRunning)
        mDataCb(CAMERA_MSG_PREVIEW_FRAME, mPreviewHeap, index, NULL, mCallbackCookie);

实际运行时发现本机视频预览闪烁,

通过以下方式解决之:

删除原来的   

 // Notify the client of a new frame.
  /* if ((mMsgEnabled & CAMERA_MSG_PREVIEW_FRAME) && mPreviewRunning)
        mDataCb(CAMERA_MSG_PREVIEW_FRAME, mPreviewHeap, index, NULL, mCallbackCookie);
*/

 

添加如下的

#if (CAM_MODIFY_FOR_QQ_EN > 0)
   //qq视频取的数据来自下面
      if ((mMsgEnabled & CAMERA_MSG_PREVIEW_FRAME) && mPreviewRunning)
      {//复制一份预览的数据给qq视频
          camera_memory_t* cam_buff =
              mGetMemoryCb(-1, frame_size, 1, NULL);
          if (NULL != cam_buff && NULL != cam_buff->data) {
              memcpy(cam_buff->data, frame, frame_size);
              mDataCb(CAMERA_MSG_PREVIEW_FRAME, cam_buff, 0, NULL, mCallbackCookie);
              cam_buff->release(cam_buff);
          } else {
              LOGE("%s: Memory failure in CAMERA_MSG_PREVIEW_FRAME", __FUNCTION__);
          }
      }
#endif
实际上就是把预览的视频数据复制一份给QQ视频的回调函数。

 

    如果需要iBeacon基站开发, 请看这里  http://cc2540.taobao.com/    , 这里能提供基于cc2540cc2541的蓝牙4.0BLE开发的详细硬件和软件资料, QQ2045315160,  阿莫单片机论坛 www.amoMCU.com  提供技术支持。

 

你可能感兴趣的:(qq)