问题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/ , 这里能提供基于cc2540或cc2541的蓝牙4.0BLE开发的详细硬件和软件资料, QQ2045315160, 阿莫单片机论坛 www.amoMCU.com 提供技术支持。