概述
metaRTC8已经在bk7258/bk7259 freertos适配成功,已经和bk7258/bk7259 sdk集成多个解决方案,解决方案(包含metaRTC源码)可从博通集成网站下载。
API应用代码
api应用代码可参考yangdemo/YangSfuDemo.c
初始化
//open audio
//uac mic
audio_parameters_t audio_parameters = {1, 1, CODEC_FORMAT_G711A, CODEC_FORMAT_G711A, DB_SAMPLE_RARE_16K, DB_SAMPLE_RARE_16K, 0};
//board mic
//audio_parameters_t audio_parameters = {1, 0, CODEC_FORMAT_G711A, CODEC_FORMAT_G711A, DB_SAMPLE_RARE_16K, DB_SAMPLE_RARE_16K, 0};
doorbell_audio_turn_on(&audio_parameters);
//open camera
//uvc
//camera_parameters_t camera_parameters = {UVC_DEVICE_ID, width, height, 1, 0, 90};
//dvp
camera_parameters_t camera_parameters = {0, width, height, 1, 0, 0};
if(doorbell_camera_turn_on(&camera_parameters)){
return;
}
YangPeerConnection* conn=(YangPeerConnection*)yang_user_calloc(1,sizeof(YangPeerConnection));
YangPacer* pacer=(YangPacer*)yang_user_calloc(1,sizeof(YangPacer));
yang_create_pacer(pacer);
// pacer->initAudio(pacer->session,Yang_AED_OPUS,48000,2);
pacer->initAudio(pacer->session,Yang_AED_PCMA,8000,1);
//pacer->initVideo(pacer->session,Yang_VED_H264,256);//720P
pacer->initVideo(pacer->session,Yang_VED_H264,128);//480P
建立连接
YangPeerConnection* conn;
yang_init_peerInfo(&conn->peer.peerInfo);
conn->peer.peerInfo.uid=0;
conn->peer.peerInfo.direction=direction;
conn->peer.peerCallback.sslCallback.context = session;
conn->peer.peerCallback.sslCallback.sslAlert = yang_sslAlert;
conn->peer.peerCallback.recvCallback.context = session;
conn->peer.peerCallback.recvCallback.receiveAudio = yang_receiveAudio;
conn->peer.peerCallback.recvCallback.receiveVideo = yang_receiveVideo;
//conn->peer.peerCallback.recvCallback.receiveMsg = yang_receiveMsg;
conn->peer.peerCallback.iceCallback.context = session;
conn->peer.peerCallback.iceCallback.onConnectionStateChange=yang_onConnectionStateChange;
conn->peer.peerCallback.iceCallback.onIceStateChange=yang_onIceStateChange;
conn->peer.peerCallback.iceCallback.onIceCandidate=yang_onIceCandidate;
conn->peer.peerCallback.rtcCallback.context=rtcCallback->context;
conn->peer.peerCallback.rtcCallback.setMediaConfig=rtcCallback->setMediaConfig;
conn->peer.peerCallback.rtcCallback.sendRequest=rtcCallback->sendRequest;
yang_create_peerConnection(conn);
//conn->addAudioTrack(Yang_AED_PCMA);
conn->addAudioTrack(&conn->peer,Yang_AED_OPUS);
conn->addVideoTrack(&conn->peer,Yang_VED_H264);
conn->addTransceiver(&conn->peer,YangMediaAudio,direction);
conn->addTransceiver(&conn->peer,YangMediaVideo,direction);
ret = yang_whip_connectWhipWhepServer(&conn->peer,url);
音频数据
YangPushData* pushData;
YangPacer* pacer;
YangFrame audioFrame;
audioFrame.payload=payload;
audioFrame.nb=nb;
audioFrame.pts=ts;
pushData=pacer->getAudioData(pacer->session,&audioFrame);
conn->on_audio(&conn->peer,pushData);
视频数据
//open lcd
// display_parameters_t display_parameters = {LCD_DEVICE_ST7701SN, 90, 0};
// doorbell_display_turn_on(&display_parameters);
frame_queue_v2_register_consumer(IMAGE_H264, CONSUMER_TRANSMISSION);
YangPushData* pushData;
YangPacer* pacer;
YangFrame videoFrame;
frame_buffer_t *frame = frame_queue_v2_get_frame(IMAGE_H264, CONSUMER_TRANSMISSION, 200);
videoFrame.pts=frame->timestamp;
videoFrame.frametype=(*(frame->frame + 4) & 0x1F) == YangAvcNaluTypeSPS?1:0;
if(videoFrame.frametype){
videoFrame.payload=payload;
videoFrame.nb=nb;
}else{
videoFrame.payload=payload+4;
videoFrame.nb=nb-4;
}
pushData=pacer->getVideoData(pacer->session,&videoFrame);
conn->on_video(&conn->peer,pushData);
frame_queue_v2_release_frame(IMAGE_H264, CONSUMER_TRANSMISSION, frame);