我试图让 ffmpeg (或 avconv)采用某种表示 rtp 转储的文件作为输入源并将其输出到视频。
ffmpeg -i rtp://<ip_addr>:<port> <outputfile>在我指定类似或 之类的内容ffmpeg -i sdp.sdp <outputfile>,然后流式传输(使用rtpplay来自 an rtpdump)到该地址/端口的情况下,我可以让它正常工作。但是,我想将实际rtpdump本身作为输入,或者表示可以作为文件(而不是流式传输)输入的 rtp 或 rtp 有效负载的东西。
到目前为止,rtpdump我尝试输入到 ffmpeg 的任何类型似乎都不起作用(通常抱怨无法找到我实际未使用的有效负载类型的编解码器参数,这让我质疑输入文件的格式) 。
有人知道有办法做到这一点吗?我不太关心输入本身rtpdump,但从wiresharkpcap 派生的东西会很好。
谢谢
我是 gstreamer 的新手,我想将包含音频和视频的 mp4 视频从我的主机(Ubuntu PC)传输到目标板。我仅成功传输视频。但流媒体(音频和视频)并没有发生。
仅传输视频的管道如下
发件人:
gst-launch-1.0 -v filesrc 位置 = video.mp4 !解码器!x264enc!rtph264支付!udpsink 主机=192.168.2.136 端口=5000
接收者:
gst-launch-1.0 -v udpsrc port = 5000 caps =“application / x-rtp,media = video,clock-rate = 90000,encoding-name = H264,payload = 96,ssrc = 3394826012,timestamp-offset = 2215812541, seqnum-offset=46353”!rtph264depay !avdec_h264!视频转换!ximagesink 同步 = false
因此,可以看到目标上的视频。
仅传输 mp4 文件中的音频。
仅传输视频的管道如下
发件人:
gst-launch-1.0 -v filesrc location=video.mp4 !qtdemux name=demuxer 解复用器。!队列 !rtpmp4apay pt=97 !udpsink 主机=192.168.2.69 端口=5000
接收者:
gst-launch-1.0 -v udpsrc 端口=5000 caps=“应用程序/x-rtp,媒体=音频,时钟速率=44100,编码名称=MP4A-LATM,cpresent=0,配置=40002420,有效负载=97, ssrc=3386264266,时间戳偏移=2822202855,seqnum-偏移=17719”!rtpmp4adepay !解码器!阿尔萨辛克 &
这也运行成功。
但是当我尝试在下面的管道中同步传输音频/视频时:
发件人:
gst-launch-1.0 -v filesrc 位置=sample.mp4 !qtdemux …
我正在尝试通过UDP协议通过网络传输RTP视频流。
这是发送方的管道代码:
https://gist.github.com/mgalushka/68d8ee034849a7db4f1f234e73a41405
如果我使用gst-launch-1.0如下命令行运行接收器,我可以接收并查看实际视频:
gst-launch-1.0 -v udpsrc address=127.0.0.1 port=1234 caps="application/x-rtp" ! rtph263pdepay ! avdec_h263 ! autovideosink
Run Code Online (Sandbox Code Playgroud)
但是当我在C代码中为同一管道执行接收器时,我看不到带有视频的窗口。这是接收器端的管道代码(完整的 - 因为我相信这里有错误):
void _receive_video_init_gstreamer(NiceAgent *magent, guint stream_id, CustomData *data)
{
GstElement *pipeline, *source, *capsfilter, *videoconvert, *h263p, *rtph263pdepay, *sink;
GstBus *bus;
GstMessage *msg;
GstStateChangeReturn ret;
GSource *bus_source;
source = gst_element_factory_make ("udpsrc", "source");
rtph263pdepay = gst_element_factory_make ("rtph263pdepay", "rtph263pdepay");
h263p = gst_element_factory_make ("avdec_h263p", "h263p");
sink = gst_element_factory_make ("autovideosink", "sink");
g_object_set (source, "address", "127.0.0.1", NULL);
g_object_set (source, "port", 1234, NULL);
g_object_set (source, "caps", …Run Code Online (Sandbox Code Playgroud) 我目前正在开发一个 WebRTC 项目。我们使用 Janus Gateway 进行 WebRTC 服务器端记录/收发等。
对于与画布相关的同步,我需要访问接收到的视频轨道的 RTP 时间戳。一段时间以来,我一直在广泛寻找一种方法。
我尝试过对等连接的 getStats 函数,但统计数据的时间戳是获取时间。不是数据包时间戳。
另外,W3的标准中明确指出:
DOMHighResTimeStamp [HIGHRES-TIME] 类型的时间戳,指示包含源的 RTP 数据包的最近播放时间。时间戳定义在[HIGHRES-TIME]中,对应于本地时钟。
getContributingSources()可以通过对象的函数访问它RTCRtpReceiver。但我注意到,该函数返回一个空数组。
重现:
https://webrtc.github.io/samples/src/content/peerconnection/pc1/
按“开始”和“呼叫”后,应显示相机源和对等连接。之后打开控制台并写入:
const receivers = pc2.getReceivers();
receivers.forEach(receiver => {
console.log(receiver.getContributingSources());
});
Run Code Online (Sandbox Code Playgroud)
我的问题是,如何访问收到的 RTP 数据包的时间戳?或者最后接收到的视频 RTP 时间戳?
提前致谢。
我的观察是否正确,即无法在同一桌面上运行的 Wireshark 中分析来自 webRTC 流的 RTP/RTCP 数据包来分析 RTP 数据包,因为浏览器会使用 DTLS/SRTP 对它们进行加密?
我知道有一些浏览器 API 可以提供帮助,但是还有其他方法吗?libpcap如果用来写一些工具可能也会有同样的问题。
我的移动相机有H264流.在我的Java应用程序中,我可以逐帧访问已经使用H264编码的流.我需要将它流式传输到Wowza媒体服务器.既然wowza只了解RTP/RTSP流,我可以在每个帧数据的前面添加RTP头并将其流式传输到wowza吗?
非常感谢你的帮助
我正在尝试将我的Android手机中的实时视频流式传输到我的PC上的桌面RTSP服务器.流式视频可以在其他设备上播放.我正在使用H.264视频编码器,因此服务器返回的SDP(作为DESCRIBE请求的回复)应该包含profile-level-id和sprop-parameter-sets字段.
该Spydroid项目展示了如何提取从解析它(从记录到SD卡中的虚拟文件,这些信息avcC块).但我不能那样做.在Spydroid中,媒体记录器和RTSP服务器位于同一设备上,因此服务器始终可以在流式传输之前记录与记录器具有相同配置的测试文件.但我正在将视频直接从手机传输到远程服务器作为RTP流.
所以我的问题是:
编辑:
我正在使用Android手机生成流,但服务器可以从任何来源接收RTP流.那么,有没有通用的方法来获得这些值?
我需要对H264 NAL单元分隔符前缀(00 00 00 01和00 00 01)做一些澄清,我使用Intel Media SDK生成H264并将其打包到RTP中.问题是,到目前为止,我只关注00 00 00 01单位分隔符,基本上只能在比特流中找到AUD,SPS,PPS和SEI单位.看看内存,我看到在SEI之后有一个字节序列00 00 01 25可能是IDR单元的开始,但是由于缺少零字节,我的搜索算法没有检测到它.任何人都可以澄清00 00 00 01和00 00 01前缀之间的区别吗?看看Chromium代码,看起来第一个单元以及AUD,SPS,PPS和SEI都有一个额外的零:
if (first_nal_in_this_access_unit ||
IsAccessUnitBoundaryNal(nal_unit_type)) {
output_size += 1; // Extra zero_byte for these nal units
first_nal_in_this_access_unit = false;
}
...
static bool IsAccessUnitBoundaryNal(int nal_unit_type) {
// Check if this packet marks access unit boundary by checking the
// packet type.
if (nal_unit_type == 6 || // …Run Code Online (Sandbox Code Playgroud) 我碰到过这样的情况:“唯一需要进行TURN的时间是当一个对等方位于对称NAT之后而另一个对等方位于对称NAT或端口受限NAT之后。” 那么,对称NAT后面的对等方如何连接另一个后面的对等方,例如全锥状NAT?
例如,让对称NAT后面的对等方为A,而全圆锥NAT后面的对等方为B。呼叫过程应类似于:
请检查我是否正确理解这些步骤。那么,A(在对称NAT后面)如何与B(在整个圆锥或地址限制的圆锥后面)进行通信?
谢谢。
我想从RTP流中读取内容,但是当我指定“ test.sdp”时,avformat_open_input()我得到以下消息:
[rtp @ 03928900] Protocol not on whitelist 'file'!
Failed: cannot open input.
avformat_open_input() fail: Invalid data found when processing input
Run Code Online (Sandbox Code Playgroud)
通常,如果我在控制台上使用ffplay,我会添加该选项-protocol_whitelist file,udp,rtp,它将正常工作。
所以我尝试了这个:
AVDictionary *d = NULL;
av_dict_set(&d, "protocol_whitelist", "file, udp, rtp", 0);
ret = avformat_open_input(&inFormatCtx, filename, NULL, &d);
Run Code Online (Sandbox Code Playgroud)
但是,仍然弹出相同的消息。有任何想法吗?