2016-06-14 2 views
0

https://github.com/BelledonneCommunications/mediastreamer2 https://github.com/BelledonneCommunications/linphone-androidDémarrez Linphone MediaStreamer2 Audio & Video Stream ensemble

En utilisant seulement mediastreamer2 bibliothèque, je suis en mesure de lancer un appel audio avec IP à distance et un port donné et appelant audiostream.c méthodes respectives.

J'ai ensuite eu besoin de lancer l'appel vidéo. ainsi initialisé videostream.c et en utilisant ses méthodes respectives et en lui fournissant des surfaces pour rendre le flux de caméra locale et distante. je suis en mesure de démarrer la vidéo avec succès avec le port distant et IP donné.

Mais le problème est quand je démarre les deux flux ensemble. le son s'arrête et le streaming vidéo s'arrête également. seul le flux de caméra local fonctionne.

Donc, j'ai une méthode magique qui fait tout cela pour moi. si je commente la partie vidéo de celui-ci. l'appel audio fonctionne bien et si commenter la partie audio, l'appel vidéo fonctionne bien. mais quand je commence les deux. Pas de son Pas de streaming. mais AudioStream a démarré avec succès et VideoStream a démarré avec succès.

Est-ce que quelqu'un avec de l'expérience avec Linphone peut aider à trouver la bonne séquence de méthodes? ou qu'est-ce que nous faisons mal. Voici notre méthode.

JNIEXPORT jint JNICALL Java_com_myapp_services_LinPhoneMSEngine_LinPhoneMSVE_1AudioStreamStartFull 
(JNIEnv *env, jclass self, jstring remote_ip, jint remote_port, jint localport, jint payloadindex, jboolean isLowEnd) 
{ 
int bRetVal = 0; 
MSVideoSize size = {320, 240}; 
char rtcp_tool[128]={0}; 
int ret; 
//jboolean copy; 
char cname[128]={0}; 
const char *cremote_ip; 

ortp_warning("Audio Stream Start Full"); 
LOGD("Audio Stream Start Full"); 

cremote_ip = (*env)->GetStringUTFChars(env, remote_ip, NULL); 
ortp_warning("Cremote_ip= %s", cremote_ip); 
LOGD("Cremote_ip= %s", cremote_ip); 

// ms_filter_enable_statistics(TRUE); 

veData->queue = ortp_ev_queue_new(); 
veData->soundCard = NULL; 

set_playback_device(); 


ortp_warning("sound: playback_dev_id: %s", ms_snd_card_get_string_id(veData->soundCard)); 
LOGD("sound: playback_dev_id: %s", ms_snd_card_get_string_id(veData->soundCard)); 

veData->CaptureCard = NULL; 
set_capture_device(); 

ortp_warning("sound: capture_dev_id: %s", ms_snd_card_get_string_id(veData->CaptureCard)); 
LOGD("sound: capture_dev_id: %s", ms_snd_card_get_string_id(veData->CaptureCard)); 


veData->audioStream = audio_stream_new(msFactory ,localport, localport + 1, false); 

audio_stream_enable_adaptive_bitrate_control(veData->audioStream, true); 
audio_stream_enable_adaptive_jittcomp(veData->audioStream, true); 
rtp_session_set_jitter_compensation(veData->audioStream->ms.sessions.rtp_session, 50); 

rtp_session_enable_rtcp_mux(veData->audioStream->ms.sessions.rtp_session, true); 
ret=AUDIO_STREAM_FEATURE_VOL_SND | \ 
      AUDIO_STREAM_FEATURE_VOL_RCV; 

if (!isLowEnd) 
{ 
    ret = ret | AUDIO_STREAM_FEATURE_EC | AUDIO_STREAM_FEATURE_EQUALIZER | AUDIO_STREAM_FEATURE_DTMF | AUDIO_STREAM_FEATURE_DTMF_ECHO; 
    audio_stream_set_features(veData->audioStream, ret); 

    ortp_warning("Setting Echo Canceller params"); 
    LOGD("Setting Echo Canceller params"); 

    rtp_session_enable_jitter_buffer(veData->audioStream->ms.sessions.rtp_session, TRUE); 

    audio_stream_set_echo_canceller_params(veData->audioStream, 60, 0, 128); 

    audio_stream_enable_gain_control(veData->audioStream, true); 
    audio_stream_enable_automatic_gain_control(veData->audioStream, true); 

} 
else 
{ 
    audio_stream_set_features(veData->audioStream, ret); 

    ortp_warning("No Echo Canceller params!!"); 
    LOGD("No Echo Canceller params!!"); 
    rtp_session_enable_jitter_buffer(veData->audioStream->ms.sessions.rtp_session, FALSE); 

} 

if(veData->audioStream == NULL){ 
    ortp_warning("AudioStream is Null"); 
    LOGD("AudioStream is Null"); 
    bRetVal = -1; 
    return -1; 
} 

audio_stream_play_received_dtmfs(veData->audioStream, true); 


snprintf(rtcp_tool,sizeof(rtcp_tool)-1,"%s-%s","Android","2.8.0"); 

snprintf(cname,sizeof(cname)-1,"%s-%d", cremote_ip, remote_port); 
ortp_warning("cname value: %s",cname); 
LOGD("cname value: %s",cname); 
audio_stream_prepare_sound(veData->audioStream, veData->soundCard, veData->CaptureCard); 

if(0== audio_stream_start_full(veData->audioStream,veData->prof, cremote_ip, remote_port, cremote_ip, remote_port + 1, 114, 50,NULL,NULL,veData->soundCard,veData->CaptureCard, !isLowEnd)) 
{ 
    veData->rtpSession = veData->audioStream->ms.sessions.rtp_session; 
    ortp_warning("AudioStreamStartFull Success"); 
    post_audio_config(veData->audioStream); 
    audio_stream_set_rtcp_information(veData->audioStream, cname, rtcp_tool); 
} 
else 
{ 
    ortp_warning("AudioStream start failed"); 
    bRetVal = -1; 
} 

// init video stream 
veData->videoStream = video_stream_new(msFactory, localport,localport+1,false); 

video_stream_enable_adaptive_bitrate_control(veData->videoStream, true); 
video_stream_enable_adaptive_jittcomp(veData->videoStream, true); 
rtp_session_enable_rtcp_mux(veData->videoStream->ms.sessions.rtp_session, true); 

video_stream_use_video_preset(veData->videoStream, "custom"); 
video_stream_set_sent_video_size(veData->videoStream, size); 
video_stream_set_preview_size(veData->videoStream, size); 
video_stream_enable_self_view(veData->videoStream, TRUE); 

ortp_message("Video Stream : [%p] & native window id : [%p]",veData->videoStream, veData->native_window_id); 
video_stream_set_native_window_id(veData->videoStream, veData->native_window_id); 

ortp_message("Video Stream : [%p] & preview window id : [%p]",veData->videoStream, veData->native_preview_window_id); 
video_stream_set_native_preview_window_id(veData->videoStream, veData->native_preview_window_id); 

video_stream_use_preview_video_window(veData->videoStream, TRUE); 
video_stream_set_device_rotation(veData->videoStream, 0); 

video_stream_set_fps(veData->videoStream, 10.0); 

// link audio with video 
audio_stream_link_video(veData->audioStream, veData->videoStream); 

ms_message("Setting webcam as %p", veData->msWebCam); 
if(bRetVal != -1 && video_stream_start(veData->videoStream, veData->prof, 
         cremote_ip, 
         remote_port, 
         cremote_ip, 
         remote_port + 1, 
         101, 
         60, 
         veData->msWebCam) >=0) { 

    ortp_warning("VideoStream started successfully"); 
    veData->rtpSession = veData->videoStream->ms.sessions.rtp_session; 

    video_stream_set_rtcp_information(veData->videoStream, cname,rtcp_tool); 
} 
else 
{ 
    ortp_warning("VideoStream start failed"); 
    bRetVal = -1; 

} 

(*env)->ReleaseStringUTFChars(env, remote_ip, cremote_ip); 


return bRetVal; 
} 
+0

Je peux aussi fournir un fichier journal. – Javanator

Répondre

1

Okay, enfin avec l'aide de @ belledonne-communications. nous avons compris que nous envoyions les deux flux sur le même port.

ce qui n'est pas possible. Il doit être envoyé sur différents ports. Nous l'avons corrigé et cela a fonctionné.