我已设法使用JAIN-SIP API for Java设置SIP呼叫.
现在,我想在建立对话框后流式传输一些视频.我已经读过SDP和RTP这是可能的,我已经找到了关于如何在SIP数据包中定义SDP/RTP主体的多个例子.
但是,一旦您在节点上协商了功能等,您如何实际启动RTP流?您是在Java应用程序之外还是内部启动RTP流服务器?如果是这样,怎么样?链接是什么?
在我能够在网上找到的,节点只是"开始交换RTP数据包".
谢谢.
我使用SDP的profile-level-id et sprop-parameter-set设置AvCodecContext的profile_idc,level_idc,extradata和extradata_size.
我将Coded Slice,SPS,PPS和NAL_IDR_SLICE数据包的解码分开:
uint8_t start_sequence [] = {0,0,1}; int size = recv(id_de_la_socket,(char*)rtpReceive,65535,0);
char *z = new char[size-16+sizeof(start_sequence)];
memcpy(z,&start_sequence,sizeof(start_sequence));
memcpy(z+sizeof(start_sequence),rtpReceive+16,size-16);
ConsumedBytes = avcodec_decode_video(codecContext,pFrame,&GotPicture,(uint8_t*)z,size-16+sizeof(start_sequence));
delete z;
Run Code Online (Sandbox Code Playgroud)
结果:ConsumedBytes> 0且GotPicture> 0(经常)
相同的代码.结果:ConsumedBytes> 0且GotPicture = 0
我认为这是正常的
当我找到一对新的SPS/PPS时,我使用此数据包的有效负载及其大小更新extradata和extrada_size.
Nal单元类型是28 => idr帧被分段为此我尝试了两种方法来解码
1)我在第一个片段(没有RTP头)前加上序列0x000001,并将其发送到avcodec_decode_video.然后我将剩下的片段发送到这个函数.
2)我将第一个片段(没有RTP头)加上序列0x000001的前缀,并将其余的片段连接到它.我把这个缓冲区发送给解码器.
在这两种情况下,我都没有错误(ConsumedBytes> 0)但我没有检测到任何帧(GotPicture = 0)......
问题是什么 ?
不幸的是,我仍然坚持使用一点RTP/RTCP通信来正确访问我的IP摄像头.
我想做什么
相机有一个我想读的内部缓冲区.因此,我通过RTSP与相机通信,并告诉它流式传输数据.当摄像机通过整个缓冲区时,流媒体将停止.
到目前为止我有什么
通过RTSP与DESCRIBE/ SETUP/ PLAYRequest(RTSP)通信以启动流的TCP连接.当Camera传输数据时,此连接必须保持打开状态.
我收到通过RTP发送的数据的端口(基于UDP) - 处理这个并不是我关心的问题,我甚至完全无法访问它,我只想提及它是为了完整性.
接收RTCP Sender Reports/的UDP套接字Source Descriptions.这很重要,因为我不知道流何时停止(如第2点所述,我不能只看流停止时).在这个Socket我读到RTCP Sender Report Goodbye到来,这意味着流式传输已经完成.然后我可以关闭TCP Socket(来自RTSP通信).
出了什么问题
它适用于2MB或4MB等小缓冲区.我收到了一些源描述,然后是Goodbye.但在我的特定测试案例中,我想使用16MB(仍然不到相机能力的一半).我收到发件人报告,但在某些时候(总是大约8MB +/- 300KB),相机才停止发送.
值得注意的是,我可以通过VLC访问缓冲区而不会出现问题.我甚至看过通信(RTSP和RTCP),它与我的应用程序几乎完全相同......我想在下面提到的一件事:
可能的原因
这是我需要你的建议的部分.
可能性:缺乏接收者报告
当通过VLC进行流式传输时,我注意到有一些RTCP Receiver Reports从VLC发送到摄像机(类似于循环Sender Reports).那么camere是否期望在Receiver Report特定时间内(或者在发送特定数量的字节之后)至少有一个?目前我想不出任何其他原因.
解?
如果我们假设相机停止流式传输,因为没有Receiver Reports我想知道是否有办法实现它们而不需要携带太多信息.我已经阅读了一些RFC 3550,我猜这些报告消息背后仍然有一堆逻辑.现在我实际上不需要,所以我也不想在这里实现完整的RTCP协议.是否足以发送一些Receiver Report虚拟帧,以便相机继续流式传输?如果是这样,他们怎么样?
如果它与缺乏无关Receiver Reports,我只是不需要它们,那么相机停止流动的原因是什么呢?有什么建议?
编辑:
好吧,我只是设法制作某种Dummy Receiver Report,它似乎工作(我只能收到12MB然后我得到了所需的再见)
我只填充了一个28Byte缓冲区,并在Header字段中使用了一些值,这意味着:
buffer[0] = 0x80; // Version 2 , …Run Code Online (Sandbox Code Playgroud) 我正在寻找一个用于设置H264视频流的最低必要SDP的示例
假设只要通过SDP获得所需参数,接收器就可以播放H264.
我是第一次使用gstreamer并尝试使用Gstreamer(RTP和UDP)将MP4视频文件从服务器传输到客户端.我试图使用的命令行:
在服务器端:
gst-launch-1.0 -v filesrc location = file_name.mp4 ! decodebin ! x264enc ! rtph264pay ! udpsink host=192.1XX.XX.XX port=9001
Run Code Online (Sandbox Code Playgroud)
在客户端:
gst-launch-1.0 -v udpsrc port=9001 caps = "application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, payload=(int)96" ! rtpstreamdepay ! decodebin ! videoconvert ! autovideosink
Run Code Online (Sandbox Code Playgroud)
我能够成功流式传输视频.但是,我不希望 decodebin 和x264enc服务器端的操作.因此,我删除了这些操作并在服务器端使用了此命令行
gst-launch-1.0 -v filesrc location =file_name.MP4 ! rtpstreampay ! udpsink host=192.1XX.XX.XX port=9001
Run Code Online (Sandbox Code Playgroud)
我无法播放视频.
任何人都可以指导我,为什么我们需要在发送数据时在这种情况下进行解码和编码操作.有没有办法在不使用这些操作的情况下发送数据.
谢谢.
我有两个SIP端点,并希望通过DTLS-SRTP发送媒体.我有点混淆以下几点
通过DTLS连接发送的DTLS-SRTP和SRTP数据包是相同还是不同?
如果不同,请你解释一下他们有什么不同?
我正在尝试通过rtp与vlc流式传输视频,默认协议是UDP,但其性能非常低(比特率,分辨率,流畅,......)
所以,我想使用vlc和rtp通过tcp协议传输视频以获得更高的性能.
有没有人可以帮助我强制vlc流rtp通过tcp协议.如果您有任何想法,请帮助我.
非常感谢!
我们正在尝试同步 2 个不同的流的 RTP 时间戳。更具体地说,我们在端口 5004 和 5005 上以 24 fps、时钟速率 90000Hz 发送两个相同的未压缩视频流,但第二个流的 RTP 时间戳中有 90000/8=11250 的偏移量。因此,当使用下面的 GStreamer 管道显示两个流时,我们希望第二个流的图像晚于 1/8 秒(=3 帧)出现。
\ncaps="application/x-rtp,media=(string)video,clock-rate=90000,encoding-name=(string)RAW,sampling=(string)YCbCr-4:2:2,depth=(string)8,width=(string)640,height=(string)480,payload=96"; \\\nGST_DEBUG="*jitter*:4" \\\ngst-launch-1.0 udpsrc buffer-size=16000000 port=5004 caps="${caps}" ! rtpjitterbuffer mode=0 ! rtpvrawdepay ! queue ! videoconvert ! fpsdisplaysink \\\n udpsrc buffer-size=16000000 port=5005 caps="${caps}" ! rtpjitterbuffer mode=0 ! rtpvrawdepay ! queue ! videoconvert ! fpsdisplaysink\nRun Code Online (Sandbox Code Playgroud)\n不幸的是,事实并非如此:rtpjitterbuffer 似乎计算从 RTP 时间戳接收到的数据包的 PTS 和 DTS 时间戳,但它对两个流使用不同的“基本 RTP 时间”:
\n0:00:00.021740027 17400 0x556306a95120 INFO rtpjitterbuffer rtpjitterbuffer.c:809:rtp_jitter_buffer_calculate_pts: resync to time 0:00:00.000000000, rtptime …Run Code Online (Sandbox Code Playgroud) 我想使用rtsp/rtp广播我的程序的屏幕(不是静态屏幕),因为这样一部手机(至少是最近的手机)可以查看流.
我正在寻找一个简单的示例程序,它采用我提供的帧,用编解码器对其进行编码,然后将其(使用rtsp)发送到任何连接的客户端.
我看过网络,到目前为止我能找到的都是完全成熟的开源媒体服务器(如darwin),这些服务器太复杂了,无法用作示例
任何帮助赞赏!
[R
ps发送jpegs到手机真的不是一个选择,因为这是非标准的,并且需要安装移动应用程序来解释'流'.
ps2 C,C++或C#会好的.
除其他外,WebRTC用于实时浏览器到浏览器媒体通信,但在我的情况下,它将用于浏览器到服务器的音频通信.
根据我收集的信息,使用RTP over UDP传输MediaStream.
除了用于信令的协议之外,这将需要至少两个额外的端口,这是我想要避免的.
在WebRTC中,是否有可能在Websocket上使用RTP而不是在UDP上使用RTP,这样我只需要使用端口80或443?