我写了一个C++应用程序(在Linux上运行),它提供大约400 kbps的RTP流.对于大多数目的地,这工作正常,但一些目的地经验包丢失.有问题的目的地似乎有一个较慢的连接,但它应该足够快到我发送的流.
由于这些目的地能够为其他应用程序接收类似的RTP流而不丢包,我的应用程序可能有问题.
我已经验证了一些事情: - 在tcpdump中,我看到所有RTP数据包在发送机器上传出 - 有一个UDP发送缓冲区到位(我尝试了64KB到300KB之间的大小) - RTP数据包大多数保持在1400字节以下避免分裂
发送应用程序可以做些什么来最小化丢包的可能性以及调试这种情况的最佳方法是什么?
我正在尝试使用内置的Videoview/MediaPlayer在我的Android应用程序中播放RTSP视频流,但是在不同的ROM或不同的网络状态(UDP数据包被阻止)上总会出现各种问题,这真的很烦人所以我想要使用live555源和GLES和ffmpeg实现我自己的rtsp客户端.我可以弄清楚如何使用ffmpeg和GLES来显示视频,但我不熟悉live555.
Android上有live555的编译版本吗?或者我怎么能自己做?
谢谢.
我想将同步媒体流式传输到多个设备(也称为多房间音频),类似于使用Sonos或AirPlay.我认为这很容易使用RTP组播,因为您只需要使用VLC(或GStreamer/ffmpeg/etc.服务器)设置一个组播流,所有客户端都可以连接到该组播流.这似乎可以在以太网上正常工作,但会导致WiFi问题(显然是由于大多数路由器上的组播数据包带宽分配较少).
这里描述的同步VLC流设置是一个很好的解决方案,但只适用于早期版本的VLC(0.8.6b).
是否还有其他选项可以通过WiFi同步媒体流?
我正在寻找一个开源的 RTP/RTCP 库。我打算使用 Python。
我可以使用预制软件连接到我的 Rtsp 服务器,但是使用以下代码片段我无法从服务器获得答案。即使连接成功,服务器也没有回答我。
public class RtspClient {
private Socket server;
private InputStream is = null;
private OutputStream os = null;
private int seqid = 1;
private String request, resp;
private byte[] buffer = new byte[4096];
private int len = 0;
public RtspClient(String rIp, int rPort) {
try {
//INIT
server = new Socket(rIp, rPort);
is = server.getInputStream();
os = server.getOutputStream();
System.out.println("Connected to "+ rIp + ":" + rPort);
//COMMUNICATION
Boolean isTalking = true;
while(isTalking == true) {
//sending request
String …Run Code Online (Sandbox Code Playgroud) 我正在努力学习H.264,RTP,RTSP和封装文件格式,以开发视频录制应用程序.
具体来说,我应该阅读什么来理解这个问题?
我希望能够回答以下问题:
我希望能够在相当低的水平上回答这些问题,以便我可以实现执行某些过程的软件(捕获RTP流,重新广播加入MP4).
背景
目标是将视频从网络摄像机录制到磁盘上.摄像机有一个RTSP服务器,提供H.264编码流,它通过RTP发送给播放器.我已经使用VLC成功播放了流,但是想要自定义流程.
我只是想让一个RTP示例正常工作,但是我看到的每个例子都因为缺少插件或不正确的引脚而无法执行.
这似乎是最有希望的,但是,虽然服务器和客户端似乎正常启动并转到"播放",但没有任何反应:
服务器:
gst-launch -v videotestsrc ! \
video/x-raw-rgb, format=\(fourcc\)RGB, width=4, height=4, frame-rate=1/1 ! rtpvrawpay !
udpsink host=127.0.0.1
Run Code Online (Sandbox Code Playgroud)
服务器输出:
/GstPipeline:pipeline0/GstUDPSink:udpsink0.GstPad:sink: caps = application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)RAW, sampling=(string)RGB, depth=(string)8, width=(string)4, height=(string)4, colorimetry=(string)SMPTE240M, payload=(int)96, ssrc=(uint)3779397700, clock-base=(uint)1161131286, seqnum-base=(uint)43390
Pipeline is PREROLLED ...
Setting pipeline to PLAYING ...
Run Code Online (Sandbox Code Playgroud)
客户:
gst-launch-0.10 -v udpsrc caps="application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)RAW, sampling=(string)RGB, depth=(string)8, width=(string)4, height=(string)4, colorimetry=(string)SMPTE240M, payload=(int)96, ssrc=(uint)3779397700, clock-base=(uint)1161131286, seqnum-base=(uint)43390" ! rtpvrawdepay ! xvimagesink
Run Code Online (Sandbox Code Playgroud)
客户输出:
Setting pipeline to PAUSED ...
Pipeline is live and does not need PREROLL ... …Run Code Online (Sandbox Code Playgroud) 正在做一个视频直播项目。
在发送方,我使用安卓手机捕获视频,获取 H264 帧并将它们打包成 RTP 数据包,遵循各自的 RFC -> RFC 3984。发送方没有问题。流由 VLC 接收和播放。
在接收器方面,又是一个安卓手机。我成功地收到了 RTP 数据包。它是一个包含 H264 动态负载的 RTP 流。我想解压缩这个流并解码它并使用android mediacodec API在接收器端呈现它。有人请指导我如何实现这一点。
谢谢你。
为我的愚蠢道歉,因为这是我在这个论坛上的第一篇文章.我试图通过以下代码检测包装无符号32位计数器和大负跳转之间的区别,但编译器给我错误:
错误:由于数据类型的范围有限,比较始终为真[-Werror = type-limits]
这是我的代码片段:
#define MAX_BACKWARD_JUMP -4294959295 //UINT_MAX - 8000
#define MIN_BACKWARD_JUMP -3600
#define MAX_FORWARD_JUMP 4800000
signed int rtpDelta; //Signed 32-bit
unsigned int currRTPTs, prevRTPTs; //unsigned 32-bit
rtpDelta = currRTPTs - prevRTPTs;
if ((rtpDelta > MAX_BACKWARD_JUMP && rtpDelta < MIN_BACKWARD_JUMP)
|| (rtpDelta > MAX_FORWARD_JUMP))
{
printf("Delta in Timestamps too large\n",rtpDelta);
}
Run Code Online (Sandbox Code Playgroud)
这里的想法是在RTP时间戳中捕获无效的大型Deltas.我们有一个当前的TimeStamp和一个从对等RTP客户端接收的前一个Timestamp.RTP时间戳的无效值的边界限制是-4294959295 <rtpDelta <-3600,如果Delta小于-3600且大于-4294959295,它应该抛出错误,因为更接近UMAX_INT的值将被视为翻转.我在这做错了什么?
我正在尝试在同一台笔记本电脑上的两个终端上流式传输和接收我的网络摄像头.为此,我使用以下命令: -
foo.sdp:
SDP:
v=0
o=- 0 0 IN IP4 127.0.0.1
s=No Name
c=IN IP4 127.0.0.1
t=0 0
a=tool:libavformat 55.2.100
m=video 1235 RTP/AVP 96
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=1
Run Code Online (Sandbox Code Playgroud)
发射:
ffmpeg -re -i /dev/video0 -r 24 -b 50k -s 858x500 -f mulaw -f rtp rtp://127.0.0.1:3000> foo.sdp
Run Code Online (Sandbox Code Playgroud)
接收:
ffplay -i foo.sdp
Run Code Online (Sandbox Code Playgroud)
虽然传输似乎工作正常,但当我使用接收命令时,我得到了错误:
Protocol not on whitelist 'file,crypto'!/0
foo.sdp: Invalid data found when processing input
Run Code Online (Sandbox Code Playgroud)