AudioStream *audio_stream_new(int loc_rtp_port, int loc_rtcp_port, bool_t ipv6){ AudioStream *stream=(AudioStream *)ms_new0(AudioStream,1); MSFilterDesc *ec_desc=ms_filter_lookup_by_name("MSOslec"); ms_filter_enable_statistics(TRUE); ms_filter_reset_statistics(); stream->ms.type = AudioStreamType; stream->ms.session=create_duplex_rtpsession(loc_rtp_port,loc_rtcp_port,ipv6); /*some filters are created right now to allow configuration by the application before start() */ stream->ms.rtpsend=ms_filter_new(MS_RTP_SEND_ID); stream->ms.ice_check_list=NULL; stream->ms.qi=ms_quality_indicator_new(stream->ms.session); if (ec_desc!=NULL) stream->ec=ms_filter_new_from_desc(ec_desc); else #if defined(BUILD_WEBRTC_AECM) stream->ec=ms_filter_new(MS_WEBRTC_AEC_ID); #else stream->ec=ms_filter_new(MS_SPEEX_EC_ID); #endif stream->ms.evq=ortp_ev_queue_new(); rtp_session_register_event_queue(stream->ms.session,stream->ms.evq); stream->play_dtmfs=TRUE; stream->use_gc=FALSE; stream->use_agc=FALSE; stream->use_ng=FALSE; stream->features=AUDIO_STREAM_FEATURE_ALL; return stream; }
static void filter_register_tester(void) { MSFilter* filter; ms_init(); ms_init(); CU_ASSERT_PTR_NOT_NULL(ms_filter_lookup_by_name("MSVoidSource")); filter= ms_filter_create_decoder("pcma"); CU_ASSERT_PTR_NOT_NULL(filter); ms_filter_destroy(filter); ms_exit(); CU_ASSERT_PTR_NOT_NULL(ms_filter_lookup_by_name("MSVoidSource")); filter= ms_filter_create_decoder("pcma"); CU_ASSERT_PTR_NOT_NULL(filter); ms_filter_destroy(filter); ms_exit(); CU_ASSERT_PTR_NULL(ms_factory_get_fallback()); }
int main(int argc, char **argv) { ortp_init(); ms_init(); zk_xmpp_uac_init(); ortp_set_log_level_mask(ORTP_MESSAGE); if (argc < 2) { fprintf(stderr, "usage: %s <zqpkt src url> [s]\n", argv[0]); return -1; } bool stream_mode = false; if (argc == 3 && argv[2][0] == 's') stream_mode = true; _stream_mode = stream_mode; if (stream_mode) fprintf(stdout, "=== STREAMING MODE ===\n\n"); else fprintf(stdout, "=== SOURCING MODE ===\n\n"); _url = argv[1]; _env = CreateEvent(0, 0, 0, 0); fprintf(stdout, "%s: using zqpkt src '%s', just wait mcu .....\n", argv[0], argv[1]); // 使用 normaluser 登录 cb_xmpp_uac cbs = { 0, 0, 0, 0, cb_connect_notify }; _uac = zk_xmpp_uac_log_in(get_user_jid(), "ddkk1212", &cbs, 0); WaitForSingleObject(_env, 10000); if (_sid == -1) { fprintf(stderr, ":( somthing err, exit!\n"); } else { SetConsoleCtrlHandler(signal_ctrl_c, 1); const char *src_url = argv[1]; const char *target_ip = _ip.c_str(); int target_port = _rtp_port; int target_port2 = _rtcp_port; //fprintf(stdout, "target ip=%s\ntarget port=%d\n\n", target_ip, target_port); // only support h264 rtp_profile_set_payload(&av_profile,100, &payload_type_h264); /// 使用 zonekey.h264.source filter zonekey_h264_source_register(); MSFilterDesc *desc = ms_filter_lookup_by_name("ZonekeyH264Source"); MSFilter *source = ms_filter_new_from_desc(desc); if (_stream_mode) zonekey_yuv_sink_register(); // 获取 writer_params ZonekeyH264SourceWriterParam writer_param; ms_filter_call_method(source, ZONEKEY_METHOD_H264_SOURCE_GET_WRITER_PARAM, &writer_param); // RTP Session RtpSession *rtpsess = rtp_session_new(RTP_SESSION_SENDRECV); // rtp_session_set_local_addr(rtpsess, "0.0.0.0", -1, -1); // 随机端口 rtp_session_set_remote_addr_and_port(rtpsess, target_ip, target_port, target_port2); rtp_session_set_payload_type(rtpsess, 100); // h264 JBParameters jb; jb.adaptive = 1; jb.max_packets = 3000; jb.max_size = -1; jb.min_size = jb.nom_size = 300; rtp_session_set_jitter_buffer_params(rtpsess, &jb); // disable video jitter control rtp_session_enable_jitter_buffer(rtpsess, 0); /// rtp sender MSFilter *rtp_sender = ms_filter_new(MS_RTP_SEND_ID); ms_filter_call_method(rtp_sender, MS_RTP_SEND_SET_SESSION, rtpsess); // connect source --> rtp sender ms_filter_link(source, 0, rtp_sender, 0); // MSTicker MSTicker *ticker = ms_ticker_new(); // attach ticker ms_ticker_attach(ticker, source); if (_stream_mode) { // FIXME: recv, but .... MSFilter *rtp_recver = ms_filter_new(MS_RTP_RECV_ID); ms_filter_call_method(rtp_recver, MS_RTP_RECV_SET_SESSION, rtpsess); MSFilter *decoder = ms_filter_new(MS_H264_DEC_ID); MSFilter *sink = ms_filter_new_from_name("ZonekeyYUVSink"); ms_filter_link(rtp_recver, 0, decoder, 0); ms_filter_link(decoder, 0, sink, 0); MSTicker *tk = ms_ticker_new(); //ms_ticker_attach(tk, rtp_recver); } // 利用 libzqpkt 接收 h264 数据,并且调用 zonekey h264 source 的 writer() void *zqp = 0; if (zqpsrc_open(&zqp, src_url) < 0) { fprintf(stderr, "to open src err\n"); return -1; } while (!_quit) { zq_pkt *pkt = zqpsrc_getpkt(zqp); if (pkt) { if (pkt->type == 1) { // h264 writer_param.write(writer_param.ctx, pkt->ptr, pkt->len, pkt->pts / 45000.0); } zqpsrc_freepkt(zqp, pkt); } else break; } // 发送删除 sid 的命令 char options[128], *cmd="test.fc.del_source"; if (_stream_mode) { snprintf(options, sizeof(options), "streamid=%d", _sid); cmd = "test.dc.del_stream"; } else snprintf(options, sizeof(options), "sid=%d", _sid); zk_xmpp_uac_send_cmd(_uac, get_mcu_jid(), cmd, options, 0, cb_response); fprintf(stderr, "\n\nen. to del sid=%d\n\n", _sid); zqpsrc_close(zqp); fprintf(stderr, "END!\n"); WaitForSingleObject(_env, 3000); // 等待 test.fc.de_source 发送成功 } return 0; }
MSFilter *ms_filter_new_from_name(const char *filter_name){ MSFilterDesc *desc=ms_filter_lookup_by_name(filter_name); if (desc==NULL) return NULL; return ms_filter_new_from_desc(desc); }