Ⅰ FATAL EXCEPTION: Thread-7890 java.lang.ExceptionInInitializerError
這個錯誤是說變數初始化出現問題,通常出現在靜態變數尤其是單例模式。這種問題往往是初始化順序不對造成的
靜態初始化程序中發生意外異常的信號。拋出 ExceptionInInitializerError 表明在計算靜態初始值或靜態變數的初始值期間發生異常。
web service,沒搞過這種東西,看看相關教程吧,特別是規范要求的配置文件
想把pjsip移植到嵌入式linux下,該設備有多個fxs/fxo埠,每個埠對應一個dsp通道。pjsip目前只是對音效卡類設備進行支持,實現的pjsua也僅僅對一個音效卡設備支持,並不支持多埠。
在移植中,可以考慮如下方法:
1、把每個fxs/fxo埠對應的dsp通道適配成一個音效卡設備,對pjsua改造,呼叫的時候,指定使用哪一個音頻設備
方法好處就是完全支持pjmedia現有的媒體框架,基本不改動原有流程和代碼。
pjsip庫升級時,原有自己實現的設備不受影響
2、在pjsip代碼中進行攔截,攔截收發報文時決定使用的那個通道
該方法修改了pjsip流程,在以後pjsip庫需要升級時,需要同步修改
3、把整個dsp適配成一個音效卡設備,擴展參數,來通知dsp使用哪個通道
該方法同樣要修改pjsip代碼,對以後升級不利
因此,最好的方法,就是把dsp的每個通道適配成一個音頻設備,混音功能同樣適配成mix設備。
pjsip目前還不支持特性 收藏
1、sip info方式dtmf接收
2、call waiting
3、t38傳真
4、t30傳真
5、digitmap
6、call parking
這些在pjsip的簡單的uaapp中都沒有,需要自己實現。可以使用pjsip-ua,pjsip lib自己實現ua或者在現有ua上進行擴充。
Ⅲ Csipsimple編譯問題
斷點調試看看嘛。把參數的class列印出來看看。
Ⅳ pjsip 本地視頻預覽怎麼改變內容源的大小 iOS
1 把視頻源當然文件來處理,sample有。不過這種方法用的不多。
2 修改vid_stream.c,在put_frame和get_frame里,換上我們自己的視頻源。這種方法使用的最多,很多人在1.x版本里支持視頻,就用這種方法。
3 重新構造sdp,自己創建rtp通道。
在sdp上,pjsua_call_make_call這個函數非常方便,直接呼叫對方。不過它在底層做了太多工作,比如啟動了音效卡。而不用這個函數,直接用比較底層的pjsip_inv_send_msg,自己處理的工作相對比較多(但不難,不過這樣就不需要pjsua這個現成的程序了,所以我們繼續用pjsua_call_make_call)。
不過還好,pj庫提供了大量的回調,其中一個:on_call_sdp_created,就是在創建sdp後回調上來,由我們自己再修改。比如我們自己定義rtp的埠g_local_port。
void on_call_sdp_created(pjsua_call_id call_id,
pjmedia_sdp_session *sdp,
pj_pool_t *pool,
const pjmedia_sdp_session *rem_sdp)
{
int nPort;
if (sdp != NULL)
{
pjmedia_sdp_media *m = sdp->media[sdp->media_count-1];
m->desc.port = g_local_port;
pjmedia_sdp_conn *c = sdp->conn;
char* addr;
if (c)
addr= c->addr.ptr;
else
{
const pj_str_t *hostname;
pj_sockaddr_in tmp_addr;
char *addr;
hostname = pj_gethostname();
pj_sockaddr_in_init(&tmp_addr, hostname, 0);
addr = pj_inet_ntoa(tmp_addr.sin_addr);
sdp->conn = (pjmedia_sdp_conn *)pj_pool_zalloc (pool, sizeof(pjmedia_sdp_conn));
sdp->conn->net_type = pj_str("IN");
sdp->conn->addr_type = pj_str("IP4");
sdp->conn->addr = pj_str(addr);
}
sdp->origin.addr = *pj_gethostname();
}
}
同樣,這里還可以修改payload type等。
這是發起呼叫時的,接收方收到後的回應之後,也會觸發這個回調,自己設定RTP埠,payload type就可以了。
2
呼叫成功後,雙方建立起連接關系,這時需要傳rtp數據了。pjsua把這些工作都放在底層了,不做任何修改,只需要在發送和接收時,自己做一些處理就行。
先說接收方(參考siprtp.c源碼):
pj_status_t init_local_rtp()
{
if (m_bInitMedia)
{
destroy_media();
}
//g_local_port = local_port;
pj_caching_pool_init(&cp, &pj_pool_factory_default_policy, 0);
pool = pj_pool_create(&(cp.factory), "test", 1000, 512, NULL);
int status;
//status = pjmedia_endpt_create(&cp.factory, pjsip_endpt_get_ioqueue(pjsua_get_pjsip_endpt()), 0, &med_endpt);
status = pjmedia_endpt_create(&cp.factory, NULL, 1, &med_endpt);
status = pjmedia_rtp_session_init(&video.out_sess, 97, pj_rand());
status = pjmedia_rtp_session_init(&video.in_sess, 97, 0);
status = pjmedia_transport_udp_create(med_endpt, NULL, g_local_port, 0, &video.transport);
m_bInitMedia = true;
video.active = true;
return 0;
}
這段代碼是本地啟動rtp一個埠用來接收視頻數據。
然後,從sdp得到對方發送的ip和埠,調用pjmedia_transport_attach,建立關聯就可以了。
Ⅳ java怎麼實現c的回調函數
以我的理解恐怕這個CALLBACK要讓你失望了~~JAVA的操作機制是隱藏了指針和引用,地址的操作在JAVA裡面是不允許的~~所以JNI介面中定義的方法,不能使用函數指針作為形參,所以這個回調函數在JAVA的CLASS中是不能調用的;
你換個思考角度用TCP/UDP程序吧,JAVA的CLASS調用的結果通過流傳遞給C/C++的Server。。。貌似我只能想到這樣了。
望採納!!
Ⅵ pjsip庫的sample怎麼用
第一步是生成 pjsip 為 Android (步驟為 Ubuntu Linux) 的源代碼:
1.設置 ANDROID_NDK_ROOT 環境變數設置為您 NDK 根文件夾。
2.轉到 pjsip 2.x 文件夾並創建 pjlib/include/pj/config_site.h 包括 config_site_sample.h ( #include <pj/config_site_sample.h> )
3.運行./configure-android
4.運行make clean && make depend && make
之後這些步驟,你將有幾個靜態庫中的幾個文件夾。我建議將它們分組相同的文件夾 (最好在您的項目中) 中的:
mkdir <your_project_path>/pjsip_libs
find . -name *.a | xargs -I % cp % <your_project_path>/pjsip_libs/
一旦你的所有庫,您需要將這些庫添加到您的項目 Android.mk 文件,這是由包括一個新的模塊節每個圖書館。此模塊部分應該是一樣的東西:
include $(CLEAR_VARS)
LOCAL_MODULE := pjsua-arm-unknown-linux-androideabi
LOCAL_SRC_FILES := $(MY_PJLIB_PATH)/libpjsua-arm-unknown-linux-androideabi.a
include $(PREBUILT_STATIC_LIBRARY)
,你其實是一節中構建您的 JNI 項目的源代碼,所有模塊都添加到您的靜態庫的引用:
LOCAL_STATIC_LIBRARIES := pjsua-arm-unknown-linux-androideabi ...
這將包括 pjsip 的引用加入您的 JNI 庫。現在,您需要配置 pjsip UA 實例。
你有一個關於 init 和開始的解釋 pjsip 的 UA (pjsua) 在 pjsip/include/pjsua-lib/pjsua.h 但要遵循的主要步驟是:
1.創建一個具有 UA 實例pjsua_create
2.創建一個工作線程與pj_thread_create
3.UA 實例的設置的默認配置:
pjsua_config cfg 樁 ;pjsua_logging_config log_cfg ;pjsua_media_config media_cfg ;
pj_cli_cfg_default(&app_config.cli_cfg.cfg) ;pjsua_logging_config_default(&log_cfg) ;pjsua_media_config_default(&media_cfg) ;
4.初始化堆棧與pjsua_init
5.啟動與堆棧pjsua_start
從這里,你有充足的配置選項 (日誌、 媒體、 交通工具等)
您可以找到基本 PJSIP 教程在這里,和裡面 pjsip 的源的根路徑,你有一個基本 (但不夠完整,基本的 SIP 使用情況) 在:pjsip-apps/src/samples/simple_pjsua.c
編輯:在生成時在 pjsip 應用程序的 android 項目,你可以面臨一個問題,因為 pjsua app 不生成默認情況下,對一般生成 (更具體地說,pjsua: 目標不包括所有上: 在 pjsip-應用程序/生成/生成文件的目標)。若要修復這只是轉到 pjsip-應用程序/創建和運行:
使 pjsua
這將創建在正確的對象文件: pjsip-apps/build/output/pjsua-arm-unknown-linux-androideabi/ (需要構建 android 樣本時)。
一旦你所有相應的對象文件,您可以在 pjsip-應用程序/src/pjsua/android 系統再次運行 ndk 生成
Ⅶ 通過ndk移植pjsip協議到android上出現error: undefined reference to 'srand'
這個問題屬於ndk r10帶來的問題,建議換成ndk r9後試試,
希望對你有用,我是ndk吧吧主,有問題可以ndk吧留言,謝謝!
Ⅷ pjsua和pjsua2的區別
PJSUA是一個開源的命令行SIP用戶代理(軟電話),用PJSIP協議,PJNATH,和PJMEDIA實現。 它雖然只有很簡單的命令行界面,但是功能齊全。
PJSUA2是PJSUA API以上的面向對象抽象。
它為構建會話發起協議(SIP)多媒體用戶代理應用程序(也稱為IP / VoIP軟電話)提供高級API。它將信令,媒體和NAT穿越功能結合到易於使用的呼叫控制API,帳戶管理,好友列表管理,在線狀態和即時消息中,以及多媒體功能,如本地會議,文件流,本地播放和語音錄制和強大的NAT穿越技術,利用STUN,TURN和ICE。
Ⅸ 如何在 android 設備上使用 pjsip G.729 編解碼的功能
第一步是生成 pjsip 為 Android (步驟為 Ubuntu Linux) 的源代碼:
1.設置 ANDROID_NDK_ROOT 環境變數設置為您 NDK 根文件夾。
2.轉到 pjsip 2.x 文件夾並創建 pjlib/include/pj/config_site.h 包括 config_site_sample.h ( #include <pj/config_site_sample.h> )
3.運行./configure-android
4.運行make clean && make depend && make
之後這些步驟,將高鎮有幾個靜態庫中的幾個文件夾。建議將它們分組相同的文件夾 (最好在您的項目中) 中的:
mkdir <your_project_path>/pjsip_libs
find . -name *.a | xargs -I % cp % <your_project_path>/pjsip_libs/
一旦自己的所有庫,您需要將這些庫添加到您的項目 Android.mk 文件,這是由包括一個新的模塊節每個圖書館。此模塊部分應該是一樣的東西:
include $(CLEAR_VARS)
LOCAL_MODULE := pjsua-arm-unknown-linux-androideabi
LOCAL_SRC_FILES := $(MY_PJLIB_PATH)/libpjsua-arm-unknown-linux-androideabi.a
include $(PREBUILT_STATIC_LIBRARY)
,其實是一節中構建您的 JNI 項目的源沒唯代碼,所有模塊都添加到您的靜態庫的引用:
LOCAL_STATIC_LIBRARIES := pjsua-arm-unknown-linux-androideabi ...
這將包括 pjsip 的引用加入您的 JNI 庫。現在,您需要配置 pjsip UA 實例。
有一個關於 init 和開始的解釋 pjsip 的 UA (pjsua) 在 pjsip/include/pjsua-lib/pjsua.h 但要遵循的主要步驟是:
1.創建一個具有 UA 實例pjsua_create
2.創建一個工作線程與pj_thread_create
3.UA 實例的設置的默認配置:
pjsua_config cfg 樁 ;pjsua_logging_config log_cfg ;pjsua_media_config media_cfg ;
pj_cli_cfg_default(&app_config.cli_cfg.cfg) ;pjsua_logging_config_default(&log_cfg) ;pjsua_media_config_default(&media_cfg) ;
4.初始化堆棧與pjsua_init
5.啟動與堆棧pjsua_start
戚察粗從這里,有充足的配置選項 (日誌、 媒體、 交通工具等)
您可以找到基本 PJSIP 教程在這里,和裡面 pjsip 的源的根路徑,有一個基本 (但不夠完整,基本的 SIP 使用情況) 在:pjsip-apps/src/samples/simple_pjsua.c
編輯:在生成時在 pjsip 應用程序的 android 項目,可以面臨一個問題,因為 pjsua app 不生成默認情況下,對一般生成 (更具體地說,pjsua: 目標不包括所有上: 在 pjsip-應用程序/生成/生成文件的目標)。若要修復這只是轉到 pjsip-應用程序/創建和運行:
使 pjsua
這將創建在正確的對象文件: pjsip-apps/build/output/pjsua-arm-unknown-linux-androideabi/ (需要構建 android 樣本時)。
一旦所有相應的對象文件,您可以在 pjsip-應用程序/src/pjsua/android 系統再次運行 ndk 生成