补充一下,其实siprtp.c这个例子更适合单独做视频传输。<br />不过考虑到在SIP软电话里加上IP摄像机传视频,pjsua功能更全面一些。<br />把这些例子看懂,会发现pjsip用起来很方便的。
请问一下你这个效果做出来怎么样呢?我也想实现一个。。
你好,如果可以的话,能否发完整的一段代码学习一下,因为你有些变量我不太理解是什么意思。。349130923[at]qq.com 谢谢。
就是参考pjsip 带的例子(siprtp.c),传送视频的。自己加的是调用ffmpeg进行编解码,这部分见ffmpeg使用的文章。
能否加个联系方式请教一下。。
博主,你好,如果可以的话,能否发完整的一段代码学习一下,1173801893[at]qq.com 谢谢。
过完节我整理一下发上来
源码在:https://github.com/sxcong/pjsipvideo_demo
源码在:https://github.com/sxcong/pjsipvideo_demo
源码在:https://github.com/sxcong/pjsipvideo_demo
楼主,你好。我现在想将设备接入到视频电话vp530,您的这种方法似乎两端都要修改,对于我这个不可行。我拦截电话传过来的sdp如下:<br />v=0<br />o=FreeSWITCH 1451868658 1451868659 IN IP4 192.168.0.108<br />s=Fre<br />2000-01-01 00:41:16 {APP, E} eSWITCH<br />c=IN IP4 192.168.0.108<br />t=0 0<br />m=audio 20042 RTP/AVP 9 8 120 0 101 102<br />a=rtpmap:9 G722/8000<br />a=rtpmap:8 PCMA/8000<br />a=rtpmap:120 opus/48000/2<br />a=fmtp:120 useinbandfec=1; usedtx=1; maxaveragebitrate=64000<br />a=rtpmap:0 PCMU/8000<br />a=rtpmap:101
对了,视频我已经编码过了。
vp530我也没用过。你先用linphone或x-lite和它通话试一下。另外,你的SDP只有audio,没看到video呀。<br /><br />m=audio 20042 RTP/AVP 9 8 120 0 101 102
唉,发现是freeSwitch修改了我的sdp,设置后就好了。现在的问题是这个sdp该怎么写?您这里的似乎是97,我有的看到是99,有的是96.有没有参考建议。谢大神了
本机的开始的sdp是这样的:<br />sprintf(send_buf,\"v=0\\r\\n\"<br /> \"o=- 3155658383 3155658383 IN IP4 %s\\r\\n\"<br /> \"s=pjmedia\\r\\n\"<br /> \"c=IN IP4 %s\\r\\n\"<br /> \"t=0 0\\r\\n\"<br /> \"a=X-nat:0\\r\\n\"<br /> \"m=audio 6070 RTP/AVP 8\\r\\n\"<br /> \"c=IN IP4 %s\\r\\n\"<br /> \"a=sendrecv\\r\\n\"<br /> \"a=rtpmap:8 PCMA/8000\\r\\n\&q
我将udp包送到电脑端口61868 ,用vlc播放的sdp如下:<br /><br />m=video 61868 RTP/AVP 96<br />a=rtpmap:96 H264/90000<br />a=fmtp:96 packetization-mode=1;profile-level-id=640015;sprop-parameter-sets=Z2QAFawrUPBf8qA=,aO48MA==;<br />a=x-dimensions: 480, 360<br />a=x-framerate: 25<br /><br />请问下,哪里会有问题吗?死活不出来了……
现在sdp生成好了,用vlc各种马赛克,请问这种一般是什么原因?
马赛克是自己重组rtp包时不完整。你可以参考pjmedia的vidstream里面实现。
马赛克也解决了。再请问下:发出去的sdp中的信息有什么作用?<br />一台可视电话的sdp信息如下:<br />v=0<br />o=- 20052 20052 IN IP4 192.168.0.134<br />s=SDP data<br />c=IN IP4 192.168.0.134<br />b=AS:2097<br />t=0 0<br />m=audio 50208 RTP/AVP 9 0 8 18 101<br />a=rtpmap:9 G722/8000<br />a=rtpmap:0 PCMU/8000<br />a=rtpmap:8 PCMA/8000<br />a=rtpmap:18 G729/8000<br />a=fmtp:18 annexb=no<br />a=rtpmap:101 telephone-event/8000<br />a=fmtp:101 0-15<br />a=ptime:20<br />m=video 50210 RTP/AVP 97 98 99
我的设备要想与它连通,是不是我的rtp负载须设置为97\\98\\98中的一种?(我的设备只支持h264编解码)。<br />我用vlc播放我设置采集发送出的udp视频,是可以正常显示的。
接下方:<br /><br />vlc可以播放,但可视电话却死活不出图像。
sdp是供双方协商用的。你发的这些分别表示端口,IP,媒体格式等,SDP有专门文档介绍,不过从字面上也大致能看出来。<br />你马赛克怎么解决的?可以补充说明一下。
你先用vlc或linphone和可视电话连接一下,看看他们的SDP
马赛克是因为原本我rtp包头有问题,从网上找了一个,修改后就好了。<br />可视电话的sdp中视频的信息如下:<br />m=video 50000 RTP/AVP 97 98 99 34 117<br />b=TIAS:2097152<br />a=rtpmap:97 H264/90000<br />a=fmtp:97 profile-level-id=64001f; max-mbps=108000; max-fs=3600; packetization-mode=1<br />a=rtpmap:98 H264/90000<br />a=fmtp:98 profile-level-id=42801f; max-mbps=108000; max-fs=3600<br />a=rtpmap:99 H264/90000<br />a=fmtp:99 profile-level-id=42801f; max-mbps=108000; max-fs=3600; packetization-mode=1<br />a=rtpmap:34 H263/90000<br />a=
我用的负载类型为96,对方的socket也是可以收到的吧? 每个关键帧都 有sps与pps信息,我的sdp应该就不用加这些了吧? 或您有获取<br />a=fmtp:99 profile-level-id=640015; max-mbps=108000; max-fs=3600; packetization-mode=1;max-mbps=108000; max-fs=3600;<br /><br />这一行的相关资料吗?
我的sps与pps信息如下:<br />67 64 00 15 AC 2B 50 F0 5F F2 A0<br />68 EE 3C 30<br />我将它base64编码后,用spsparser 解析后宽高都不对。
sdp是双方协商用的,他已经说明接收97,98,99,你发96当然不行。他的SDP里已经写明,97,98,99分别对应profile-level-id=64001f;profile-level-id=42801f;profile-level-id=42801f;你看看你的264是哪种,就把96改成相对应的数字。<br />你用linphone与电话机调试,可以看linphone的sdp,然后再对比自己的。<br />用ffmpeg编译后,sps和pps可以从encode之后的帧直接取出来,不用自己构造了。帧类型分别是7和8,去掉00 00 00 01就可以。
我的linephone始终无法注册到本机的服务器
我的设备发送的关键帧rtp包如下:<br />806000730005a8700000000a1c8000000167640014ac2b50b04b200000000168ee3c300000000106e5014b800000000165b8000008d2e04f………………<br />而可视电话的h264发出的如下<br />8060156714a7bf487491adaf210389a31a344057c29a5f42b01f603dfe33402ed216f9d27f197f60fd16cff043d8aff19a0165183405a54ba5f1bb00e5f7ec0b6019842fb2ffc1758……<br />它的sdp:<br />m=video 50026 RTP/AVP 97 98 99 34 117<br />b=AS:2097152<br />a=rtpmap:97 H264/90000<br />a=fmtp:97 profile-level-id=640029; max-mbps=245760; max-fs=8192; packetization-mode=1<br />只有这几个信息就可以解了吗?我发送的rtp包是否应去除
linephone在我这里可以,服务器asterisk, repro,kaimailio都支持。不过也可以不注册直接呼叫,就是sip:user@ip这种方式。<br />看你的情况,可能需要去掉00000001。不过解码器一般都会识别,关系到不大。
我现在能得到两种视频帧,存储在char *frame中:<br />I帧内容(包含sps与pps,格式即00 00 00 01 [sps] 00 00 00 01 [pps] 67 42):<br />00 00 00 01 67 42 E0 14 DA 05 82 51 00 00 00 01 68 CE 30 A4 80 00 00 00 01 65 B8 40……<br />P帧:<br />00 00 00 01 61 AA 42……<br />大小均1000多字节,我需要将它们用rtp打包发送,让其它程序解码播放。请问下我该怎么做?<br />我试过,对这些流不处理,以[rtp头][I帧] 、[rtp头][P帧]这种方式发送,对方解不出来。
解码前要去掉RTP头。<br />你可以这样:接收方收到数据时,先保存到文件时。然后分析文件,找sps,pps,看看对不对。
多谢您的解答,目前我参照RFC3984协议已经成功让对方接收我的视频了。
你好 你的问题解决了嘛?我也是vlc可以正常播放,但是电话一直黑屏,两天了都。求赐教~
代码可以发我一份么,谢谢了,zhyhpp1988@163.com
通过rtsp流取到的rtp包是已经编码好的,我需要重新解码,然后再用pjsip编码,才能发送吗?
通过rtsp流取到的rtp包是已经编码好的,我需要重新解码,然后再用pjsip编码,才能发送吗?
不用解码,只是去掉RTP包头,还原成原始的视频帧。
我这边的环境是 opensips+ffserver+linphone,出现了各种问题
请问在on_call_sdp_created回调函数中,我直接读取应用程序默认创建的rtp端口,不重新自定义rtp端口去传数据可以吗?
发送数据时,调用pjmedia_transport_send_rtp()函数,发送的是一帧一帧的数据吗?需要将4字节的开始码00 00 00 01去掉吗?
发送数据时,调用pjmedia_transport_send_rtp()函数,发送的是一帧一帧的数据吗?需要将4字节的开始码00 00 00 01去掉吗?