Pjsip pjsua2 örnek Android Uygulamasının video kalitesini nasıl iyileştirebilirim?
Mevcut varsayılan örnek Android pjsip pjsua2 örnek uygulaması çok kötü bir video kalitesi gönderiyor ve bunları en az Hd kalitesine yükseltmek istiyor. Aşağıdaki yöntemleri kullanmayı denedim, ancak çok düşük video kalitesi göstermeye devam ediyor. Giden video kalitesini nasıl iyileştirebilirim. Bu örnek uygulama, diğer video görüşmelerinden 355 * 288'e kadar video kalitesi alabilir, ancak çok düşük bir video kalitesi gönderir. Şu anda, giden arama yapmadan hemen önce MediaFormatvideo dosyasından aşağıdaki değeri güncelleyerek hd video elde etmeye çalıştım. Ve giden videoyu iyileştirmeye hiç yardımcı olmuyor. Bu özniteliği yanlış yerlerde mi güncelliyorum?
Şu anda 192 * 144'ün altında video kalitesi gönderiyor ve 352 * 288'in üzerinde video kalitesini kabul etmiyor. en az 1280 * 720 video kalitesini desteklemek için nasıl güncelleyebilirim
MediaFormatVideo mf=new MediaFormatVideo();
mf.setFpsNum(30);
mf.setFpsDenum(1);
mf.setAvgBps(512000);
mf.setMaxBps(1024000);
mf.setHeight(720);
mf.setWidth(1280);
Bu ayarları aşağıdaki gibi güncelliyorum.
MyCall call = new MyCall(account, -1);
CallOpParam prm = new CallOpParam(true);
AccountVideoConfig avc=new AccountVideoConfig();
MediaFormatVideo mf=new MediaFormatVideo();
Log.e("javan-video",String.valueOf(avc.getAutoShowIncoming()));
Log.e("javan-videofps",String.valueOf(mf.getFpsNum()));
mf.setFpsNum(30);
mf.setFpsDenum(1);
mf.setAvgBps(512000);
mf.setMaxBps(1024000);
mf.setHeight(720);
mf.setWidth(1280);
Log.e("javan-videofps",String.valueOf(mf.getFpsNum()));
try {
call.makeCall("sip:"+dialno+"@peoplefone.ch", prm);
AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
am.setSpeakerphoneOn(true);
// startRinging();
} catch (Exception e) {
call.delete();
return;
}
currentCall = call;
showCallActivity();
}
bir belge buldum, uygulamaya çalıştım .. ancak video kalitesini iyileştiremedim
Framerate
Specify number of frames processed per second.
For encoding direction, configured via pjmedia_vid_codec_param.enc_fmt.det.vid.fps, e.g:
/* Sending @30fps */
param.enc_fmt.det.vid.fps.num = 30;
param.enc_fmt.det.vid.fps.denum = 1;
Note:
that there is a possibility that the value will be adjusted to follow remote capability. For example, if remote signals that maximum framerate supported is 10fps and locally the encoding direction framerate is set to 30fps, then 10fps will be used.
limitation: if preview is enabled before call is established, capture device will opened using default framerate of the device, and subsequent calls that use that device will use this framerate regardless of the configured encoding framerate that is set above. Currently the only solution is to disable preview before establishing media and re-enable it once the video media is established.
For decoding direction, two steps are needed:
pjmedia_vid_codec_param.dec_fmt.det.vid.fps should be set to the highest value expected for incoming video framerate.
signalling to remote, configured via codec specific SDP format parameter (fmtp): pjmedia_vid_codec_param.dec_fmtp.
H263-1998, maximum framerate is specified per size/resolution basis, check here for more info.
/* 3000/(1.001*2) fps for CIF */
param.dec_fmtp.param[m].name = pj_str("CIF");
param.dec_fmtp.param[m].val = pj_str("2");
/* 3000/(1.001*1) fps for QCIF */
param.dec_fmtp.param[n].name = pj_str("QCIF");
param.dec_fmtp.param[n].val = pj_str("1");
H264, similar to size/resolution, the framerate is implicitly specified in H264 level (check the standard specification or this) and the H264 level is signalled via H264 SDP fmtp profile-level-id, e.g:
/* Can receive up to 1280×720 @30fps */
param.dec_fmtp.param[n].name = pj_str("profile-level-id");
param.dec_fmtp.param[n].val = pj_str("xxxx1f");
Bitrate
Specify bandwidth requirement for video payloads stream delivery.
This is configurable via pjmedia_vid_codec_param.enc_fmt.det.vid.avg_bps and pjmedia_vid_codec_param.enc_fmt.det.vid.max_bps, e.g:
/* Bitrate range preferred: 512-1024kbps */
param.enc_fmt.det.vid.avg_bps = 512000;
param.enc_fmt.det.vid.max_bps = 1024000;
Notes:
This setting is applicable for encoding and decoding direction, currently there is no way to set asymmetric bitrate. By decoding direction, actually it just means that this setting will be queried when generating bandwidth info for local SDP (see next point).
The bitrate setting of all codecs will be enumerated and the highest value will be signalled in bandwidth info in local SDP (see ticket #1244).
There is a possibility that the encoding bitrate will be adjusted to follow remote bitrate setting, i.e: read from SDP bandwidth info (b=TIAS line) in remote SDP. For example, if remote signals that maximum bitrate is 128kbps and locally the bitrate is set to 512kbps, then 128kbps will be used.
If codec specific bitrate setting signalling (via SDP fmtp) is desired, e.g: MaxBR for H263, application should put the SDP fmtp manually, for example:
/* H263 specific maximum bitrate 512kbps */
param.dec_fmtp.param[n].name = pj_str("MaxBR");
param.dec_fmtp.param[n].val = pj_str("5120"); /* = max_bps / 100 */
belge bağlantısı: bağlantı açıklamasını buraya girin
From: "0525512904" <sip:[email protected]>;tag=1609930889511
I: To: <sip:[email protected]>;tag=c6ce5331-3a35-44c8-bb80-23b6ec664085
I: CSeq: 1 INVITE
I: Allow: PRACK, INVITE, ACK, BYE, CANCEL, UPDATE, INFO, SUBSCRIBE, NOTIFY, REFER, MESSAGE, OPTIONS
I: Contact: <sip:[email protected]:45483;transport=TLS;ob>
I: Supported: replaces, 100rel, timer, norefersub
I: Content-Type: application/sdp
I: Content-Length: 580
I: v=0
I: o=- 3818919690 3818919691 IN IP4 192.168.3.135
I: s=pjmedia
I: b=AS:352
I: t=0 0
I: a=X-nat:0
I: m=audio 4012 RTP/AVP 96 120
I: c=IN IP4 192.168.3.135
I: b=TIAS:64000
I: a=rtcp:4031 IN IP4 192.168.3.135
I: a=sendrecv
I: a=rtpmap:96 speex/16000
I: a=rtpmap:120 telephone-event/16000
I: a=fmtp:120 0-16
I: a=ssrc:1510027056 cname:365aaa4f448493db
I: m=video 4013 RTP/AVP 97
I: c=IN IP4 192.168.3.135
I: b=TIAS:256000
I: a=rtcp:4033 IN IP4 192.168.3.135
I: a=sendrecv
I: a=rtpmap:97 H264/90000
I: a=fmtp:97 profile-level-id=42e01e; packetization-mode=1
I: a=ssrc:1146236185 cname:365aaa4f448493db
I: a=rtcp-fb:* nack pli
I: --end msg--
E: ringing call
tam günlük bağlantısı sip çağrısı tamamlandı günlüğü
Yanıtlar
Hala verilen bilgilerle sorunuzu yanıtlayamıyorum.
SDP, SIP protokolünün yük tipi olarak kullanılır .
Bunu (kısmen) SIP günlüğünüzde görebilirsiniz:
Content-Type: application/sdp
SDP bir teklif / cevap protokolüdür.
Eksik günlük kesmesi göz önüne alındığında, SIP DAVETİ vermişsiniz (BÜTÜN yudum mesajını vermemiş olduğunuzu varsayıyorum), bu nedenle TEKLİF'i yalnızca SDP procotolünü verdiniz. Öyleyse, hem TEKLİF hem de CEVAP sağlamanız gereken tam bir resim elde edin.
Ayrıca diğer PJSIP günlüğünü de video kodlayıcı / kod çözücü kurulumunun çevresine dahil etmek iyi olacaktır.
Teklifinizde şöyle diyor:
m=video 4013 RTP/AVP 97
şu parametrelerle video gönderebileceğiniz / alabileceğiniz anlamına gelir:
a=rtpmap:97 H264/90000
a=fmtp:97 profile-level-id=42e01e; packetization-mode=1
Bu, H264'ü 90000 örnekleme hızıyla (yani 90 kHz) gönderebilir / alabilir anlamına gelir.
H264 parametreleri ayarı: a = fmtp: 97 profil düzeyi kimliği = 42e01e; paketleştirme modu = 1
Yani...
profile-level-id=42e01e
https://tools.ietf.org/html/rfc6184
profile-level-id: A base16 [7] (hexadecimal) representation of the following three bytes in the sequence parameter set NAL unit is specified in [1]: 1) profile_idc, 2) a byte herein referred to as profile-iop, composed of the values of constraint_set0_flag, constraint_set1_flag, constraint_set2_flag, constraint_set3_flag, constraint_set4_flag, constraint_set5_flag, and reserved_zero_2bits in bit- significance order, starting from the most-significant bit, and 3) level_idc. Note that reserved_zero_2bits is required to be equal to 0 in [1], but other values for it may be specified in the future by ITU-T or ISO/IEC.
profile_idc: 0x42 (66) profile-iop: 0xE0 (ikili 11100000) level_idc: 0x1E (30)
https://en.wikipedia.org/wiki/Advanced_Video_Coding
profile_idc: 66
Temel Profil (BP, 66) Öncelikle ek veri kaybı sağlamlığı gerektiren düşük maliyetli uygulamalar için, bu profil bazı video konferans ve mobil uygulamalarda kullanılır. Bu profil, Kısıtlı Temel Profilde desteklenen tüm özelliklerin yanı sıra kayıp sağlamlığı için (veya düşük gecikmeli çok noktalı video akışı birleştirme gibi başka amaçlar için) kullanılabilen üç ek özelliği içerir. Bu profilin önemi, 2009'da Kısıtlanmış Temel Profilin tanımlanmasından bu yana bir şekilde azaldı. Tüm Sınırlandırılmış Temel Profil bit akışları, bu iki profil aynı profil tanımlayıcı kod değerini paylaştığından, Temel Profil bit akışları olarak da kabul edilir.
profile-iop: ikili 11100000
Bunun anlamı:
constraint_set0_flag=1 (Constrained Baseline profile)
constraint_set1_flag=1
constraint_set2_flag=1
Bu iki değer IDC ve kısıtlama bayrakları, kod çözücülerin neyi destekleyebileceğine bağlı olarak video kodlayıcıları kurmak için kullanılır.
Düzeyler: 30 ie 3.0
Level: 3.0 Maximum decoding speed (macroblocks/s): 40,500 Maximum
frame size (macroblocks): 1,620 Maximum video bit rate for video
coding layer (VCL): 10,000 Examples for high resolution @ highest
frame rate (maximum stored frames):
352×[email protected] (12)
352×[email protected] (10)
720×[email protected] (6)
720×[email protected] (5)
Profil seviyesi bir video çözünürlüğü belirtmez, manuel olarak maksimum kare boyutu / bit hızı belirtir. Bu kısıtlamalara "sığabilen" HERHANGİ bir çözünürlük / kare hızı kombinasyonu geçerlidir. Bu, bir özet / çerçeve listesinin geçerli olarak listelendiği yerdir.
Dolayısıyla 720 × 480 @ 30fps VEYA 720 × 576 @ 25fps, seviye 3.0 profili için göndermek için geçerlidir.
Teklif, karşı tarafa şunu söylüyor:
- Bu taraf, yalnızca Kısıtlanmış Temel Profil H264 kodlanmış akışı DECODE edebilir.
- Bu taraf yalnızca Seviye 3.0 bit hızlarına kadar DECODE yapabilir (yani yukarıdaki çözünürlük / fps kombinasyonları listesi)
Teklif, aygıtın diğer tarafa NE göndereceğini söylemez, bu, yerel kurulumunuza ve diğer tarafın DECODE yapabileceğini söylediklerine bağlı olacaktır.
PJSIP, kurulumunuza ve desteklenen kod çözme teklifine bağlı olarak gönderebileceği en iyi çözünürlüğü / fps'yi "seçer" (bu nedenle kodlayıcı kurulumu hakkında PJSIP günlüklerini görebilirsiniz), SDP YANITINA (değil sağlanır).
Videonun simetrik olması gerekmez. Örneğin, kamera / ekran H / W'ye bağlı olarak, gönderebileceğinizden farklı çözünürlükler görüntüleyebilirsiniz.
Bu, akış sırasında dinamik olarak değişen çözünürlükler gibi şeyleri de hesaba katmaz (örneğin, RTCP raporlarından gelen ağ bant genişliği değişikliklerine bağlı olarak dikey / yatay çevirme veya çözünürlük artışı / azalışı). Buna bakmanın tek yolu, ne yaptığını anlamak için H264 akışını yakalamak ve kodunu çözmek olabilir. PJSIP günlüğü de size söyleyebilir.
GÜNCELLEME
Pjsip günlük çıktısına bakıldığında, hem DAVET'te SDP teklifini hem de 200 Tamam'daki yanıtı görebilirsiniz.
I: 11:13:36.176 pjsua_core.c .RX 1119 bytes Response msg 200/INVITE/cseq=22580 (rdata0x6f73203b18) from TLS 95.128.80.3:5061:
I: SIP/2.0 200 OK
I: To: <sip:[email protected]>;tag=61c5c92f
I: Via: SIP/2.0/TLS 146.4.49.20:49305;received=146.4.49.20;rport=49305;branch=z9hG4bKPjdad60ffa-6072-4c6d-8eb1-4a32ab26443a;alias
I: Record-Route: <sip:95.128.80.5;r2=on;lr=on;did=e8.cc62>,<sip:95.128.80.3:5061;transport=tls;r2=on;lr=on;did=e8.cc62>
I: CSeq: 22580 INVITE
I: Call-ID: 0e7676b2-1ca2-48b2-9696-f7e6dc7e1ec9
I: From: <sip:[email protected]>;tag=0b4094bb-b47e-4132-960c-ac564015efa0
I: Content-Type: application/sdp
I: Contact: <sip:[email protected]:5060;alias=95.128.80.93~5060~1>
I: Content-Length: 535
I: v=0
I: o=- 3819003211 3819003212 IN IP4 95.128.80.5
I: s=pjmedia
I: b=AS:352
I: t=0 0
I: a=X-nat:0
I: m=audio 20918 RTP/AVP 96 120
I: c=IN IP4 95.128.80.5
I: b=TIAS:64000
I: a=rtpmap:96 speex/16000
I: a=rtpmap:120 telephone-event/16000
I: a=fmtp:120 0-16
I: a=ssrc:1254727526 cname:496ca0741b8de59f
I: a=sendrecv
I: a=rtcp:20919
I: m=video 20956 RTP/AVP 97
I: c=IN IP4 95.128.80.5
I: b=TIAS:256000
I: a=rtpmap:97 H264/90000
I: a=fmtp:97 profile-level-id=42e01e; packetization-mode=1
I: a=ssrc:977888024 cname:496ca0741b8de59f
I: a=rtcp-fb:* nack pli
I: a=sendrecv
I: a=rtcp:20957
I: --end msg--
Yanıttan, teklifle aynı H264 parametreleriyle yanıt verdiğini görebilirsiniz:
I: m=video 20956 RTP/AVP 97
...
I: a=rtpmap:97 H264/90000
I: a=fmtp:97 profile-level-id=42e01e; packetization-mode=1
Bu nedenle, H264 düzey 3.0 bit hızlarına kadar kabul eder.
Yakalama cihazının (kamera) ilklendirilmesine bakarsanız şu günlükleri görürüz:
I: 11:13:36.270 vid_port.c .........Opening device OpenGL renderer [OpenGL] for render: format=I420, size=352x288 @15:1 fps
Bu, android ön kameranın 352x288 @ 15fps çözünürlükte açıldığı anlamına gelir.
Sanırım bahsettiğiniz video kalitesinin nedeni budur.
Pjsip için kaynak koduna bakıldığında, desteklenen parametrelerle kameraları numaralandırır.
Desteklenen yakalama çözünürlüğü boyutu, daha sonra gönderilebilen "izin verilen" çözünürlük boyutlarına göre küçültülmüş varsayılan yakalama çözünürlüğü boyutuyla belirlenir.
İzin verilen boyutlar 352x288 @ 15'ten büyük olduğundan, yalnızca Andriod'un ön kameranızın varsayılan yakalama çözünürlüğünün 352x288 @ 15 olduğunu varsayabilirim.
Bir alıcı çözümü veya daha iyi bir ön kamerası olan başka bir Andriod cihazı alıp almadığınızı görmek için ön kamera yerine arka kamerayı kullanmayı deneyebilirsiniz.
PjSip, kamera cihazlarına erişmek ve bunları kullanmak için android.hardware.Camera API'sini kullanır. Pjsip'in kamera cihazlarını nasıl kullandığına ilişkin ayrıntılar için PjCameraInfo ve PjCamera'ya bakın .