2014-02-27 40 views
8

我想添加SIP電話到my quiz game。所以,我已經建立了SipHome項目通過這種方式:Android。 cSipSimple。如何將視頻通話集成到項目中?

http://code.google.com/p/csipsimple/wiki/HowToBuild#Without_building_the_native_library

這是好的。應用程序編譯並啓動。 現在我想添加視頻通話功能在我的應用程序。結帳(http://csipsimple.googlecode.com/svn/trunk/)之後,我也有這個SVN依賴關係:

CSipSimpleBranded 
CSipSimpleCodecG729 
CSipSimpleCodecPack 
CSipSimpleVideoPlugin 

我已經把班PluginReceiver,CaptureReceiver,PluginReceiverFfmpeg和PluginReceiverVpxCSipSimpleVideoPlugin項目SipHome項目。同時,我已經把接收器的描述來SipHome清單項目:

prefProviderWrapper.setPreferenceBooleanValue(SipConfigManager.USE_VIDEO, true); 

當我打電話InCallActivity我看到:

<receiver android:name=".plugins.video.PluginReceiver" > 
     <intent-filter> 
      <action android:name="com.csipsimple.plugins.action.REGISTER_VIDEO" /> 
     </intent-filter> 

     <meta-data 
      android:name="lib_name" 
      android:value="libpj_video_android.so" /> 
     <!-- For now it does not matter in the future we should have one per device, codec, and converter (if needed) --> 
     <meta-data 
      android:name="init_factory" 
      android:value="pjmedia_webrtc_vid_render_factory" /> 
    </receiver> 

    <!-- 
    Receiver for video capture 
    <receiver android:name=".plugins.video.CaptureReceiver" > 
     <intent-filter> 
      <action android:name="com.csipsimple.plugins.action.REGISTER_CAPTURE_VIDEO" /> 
     </intent-filter> 

     <meta-data 
      android:name="lib_name" 
      android:value="libpj_screen_capture_android.so" /> 
     <meta-data 
      android:name="init_factory" 
      android:value="pjmedia_webrtc_vid_capture_factory" /> 
    </receiver> 
    --> 
    <receiver android:name=".plugins.video.PluginReceiverFfmpeg" > 
     <intent-filter> 
      <action android:name="com.csipsimple.codecs.action.REGISTER_VIDEO_CODEC" /> 
     </intent-filter> 

     <meta-data 
      android:name="lib_name" 
      android:value="libpj_video_android.so" /> 
     <meta-data 
      android:name="init_factory" 
      android:value="pjmedia_codec_ffmpeg_vid_init" /> 
     <meta-data 
      android:name="deinit_factory" 
      android:value="pjmedia_codec_ffmpeg_vid_deinit" /> 
    </receiver> 
    <receiver android:name=".plugins.video.PluginReceiverVpx" > 
     <intent-filter> 
      <action android:name="com.csipsimple.codecs.action.REGISTER_VIDEO_CODEC" /> 
     </intent-filter> 

     <meta-data 
      android:name="lib_name" 
      android:value="libpj_vpx.so" /> 
     <meta-data 
      android:name="init_factory" 
      android:value="pjmedia_codec_vpx_init" /> 
     <meta-data 
      android:name="deinit_factory" 
      android:value="pjmedia_codec_vpx_deinit" /> 
    </receiver> 

我登錄後設置USE_VIDEO = true標誌VideoButton,但按下後,我有這在logcat:

pjsua_vid.c。無法創建re-INVITE:媒體行中沒有SDP有效負載格式(PJMEDIA_SDP_ ENOFMT)[status = 220032]

並且視頻不顯示。

謝謝。

+2

給問題添加賞金並不會改變沒有人會爲您寫代碼的事實。 –

+0

對不起,我不需要代碼。我想描述下一步我需要做什麼?如何添加視頻插件到我的項目?謝謝。 – anivaler

+0

它基本上是一樣的東西。在這個網站上,你應該展示你自己的努力,你應該嘗試自己去做,當你遇到一個特定的問題時,我們可以幫助你。你有沒有嘗試自己添加到你的應用程序?試圖添加它時遇到了什麼問題?你有沒有嘗試搜索谷歌和Stackoverflow上的答案?或者在你的情況下,你已經找到了完美的信息來源。您正在鏈接的項目是一個已經集成了此功能並且是開源的應用程序。你爲什麼不在那裏尋找你的答案? –

回答

-1

您不需要將任何接收器添加到主清單中,它們僅用於檢查是否安裝了插件。

下面是一個使用指南CSipSimple對於沒有VideoPLugin視頻通話:d

修改CSipSimpleVideoPlugin構建腳本,所以它複製libpj_video_android.so到CSipSimple libs目錄。 (或者每次構建時手動將其複製)。

最後要包含視頻庫,您需要修改PjsipService,將273行替換爲307;

String videoLibraryPath = NativeLibManager.getLibraryPath(mContext, "libpj_video_android.so"); 

if (!videoLibraryPath.isEmpty()) { 

pj_str_t pjVideoFile = pjsua.pj_str_copy(videoLibraryPath); 

// Render 
dynamic_factory videoRenderFactory = csipSimpleConfig.getVideo_render_implementation(); 
videoRenderFactory.setInit_factory_name(pjsua.pj_str_copy("pjmedia_webrtc_vid_render_factory")); 
videoRenderFactory.setShared_lib_path(pjVideoFile); 

// Capture 
dynamic_factory videoCaptureFactory = csipSimpleConfig.getVideo_capture_implementation(); 
videoCaptureFactory.setInit_factory_name(pjsua.pj_str_copy("pjmedia_webrtc_vid_capture_factory")); 
videoCaptureFactory.setShared_lib_path(pjVideoFile); 

// Video codecs 
List<CodecInfo> availableCodecs = Lists.newArrayList(
     new CodecInfo(NativeLibManager.getLibraryPath(mContext, "libpj_video_android.so"), 
       "pjmedia_codec_ffmpeg_vid_init", "pjmedia_codec_ffmpeg_vid_deinit"), 

     new CodecInfo(NativeLibManager.getLibraryPath(mContext, "libpj_vpx.so"), 
       "pjmedia_codec_vpx_init", "pjmedia_codec_vpx_deinit") 
); 

dynamic_factory[] cssCodecs = csipSimpleConfig.getExtra_vid_codecs(); 
dynamic_factory[] cssCodecsDestroy = csipSimpleConfig.getExtra_vid_codecs_destroy(); 

int videoCodecIndex = 0; 
for (CodecInfo codecInfo : availableCodecs) { 
    if (!TextUtils.isEmpty(codecInfo.mLibraryPath)) { 
     // Create 
     cssCodecs[videoCodecIndex].setShared_lib_path(pjsua.pj_str_copy(codecInfo.mLibraryPath)); 
     cssCodecs[videoCodecIndex].setInit_factory_name(pjsua.pj_str_copy(codecInfo.mFactoryInitFunction)); 
     // Destroy 
     cssCodecsDestroy[videoCodecIndex].setShared_lib_path(pjsua.pj_str_copy(codecInfo.mLibraryPath)); 
     cssCodecsDestroy[videoCodecIndex].setInit_factory_name(pjsua.pj_str_copy(codecInfo.mFactoryDeinitFunction)); 
    } 
    videoCodecIndex++; 
} 

csipSimpleConfig.setExtra_vid_codecs_cnt(videoCodecIndex); 

// Converter 
dynamic_factory convertImpl = csipSimpleConfig.getVid_converter(); 
convertImpl.setShared_lib_path(pjVideoFile); 
convertImpl.setInit_factory_name(pjsua.pj_str_copy("pjmedia_libswscale_converter_init")); 

NativeLibManager:

public static String getLibraryPath(Context context, String libraryName) { 
    String libraryPath = ""; 

    PackageManager packageManager = context.getPackageManager(); 

    PackageInfo packageInfo = null; 

    if (packageManager != null) { 
     try { 
      packageInfo = packageManager.getPackageInfo(context.getPackageName(), PackageManager.GET_SHARED_LIBRARY_FILES); 
     } catch (NameNotFoundException e) { 
      logger.error(e.getMessage()); 
     } 
    } 

    File libFile = getLibFileFromPackage(packageInfo.applicationInfo, libraryName); 

    if (libFile != null) { 
     libraryPath = libFile.getAbsolutePath(); 
    } 

     return libraryPath; 
    } 

要修改你需要看看dispatch_shared_libs.sh構建腳本,可能東西沿着線; (其中「sipstack」是您的csipsimple目錄...)

move_generic_lib() { 
    echo -n "Moving $1.so to $2 project ... " 
    libs_files=$(ls libs/*/${1}.so 2> /dev/null | wc -l | sed -e 's/^[ \t]*//') 
    if [ "$libs_files" != "0" ]; then 
     for lib_folder in libs/*; do 
      if [ -d ${lib_folder} ]; then 
       mkdir -p ../${2}/${lib_folder}; 
       mv ${lib_folder}/${1}.so ../${2}/${lib_folder}/${1}.so; 
      fi 
     done 
     echo "[OK]"; 
    else 
     echo "[--] - plugin not built" 
    fi 
} 

move_lib() { 
    move_generic_lib libpj_${1}_codec CSipSimpleCodec${2} 
} 

move_lib "g7221" "Pack" 
move_lib "codec2" "Pack" 
move_lib "opus" "Pack" 
move_lib "g726" "Pack" 
move_lib "aac" "Pack" 
move_lib "g729" "G729" 
move_generic_lib "libcrypto" "sipstack" 
move_generic_lib "libssl" "sipstack" 
move_generic_lib "libpj_video_android" "sipstack" 

move_generic_lib "libpj_screen_capture_android" "sipstack" 
move_generic_lib "libpj_vpx" "sipstack" 
+0

感謝您的幫助,農曆。但我在哪裏可以得到libpj_video_android.so文件? – anivaler

+0

您將需要構建該文件,因此請執行「製作VideoLibs」。 – Lunar

+0

哇,我認爲這兩種替代方法:1. http://code.google.com/p/csipsimple/wiki/HowToBuild#Build_native_library 2. http://code.google.com/p/csipsimple/wiki/ HowToBuild#Without_building_the_native_library – anivaler