我正在尝试使用Python从IP摄像机流式传输RTP数据包.
我能够使用RTSP协议发送describe,setup和play命令,但是,我无法使用RTP开始流式传输实际的视频流.
这是代码:
import socket
def printrec(recst):
recs=recst.split('\r\n')
for rec in recs:
print rec
dest="DESCRIBE rtsp://admin:12345@192.168.1.74 RTSP/1.0\r\nCSeq: 2\r\nUser-Agent: python\r\nAccept: application/sdp\r\n\r\n"
setu="SETUP rtsp://admin:12345@192.168.1.74/trackID=1 RTSP/1.0\r\nCSeq: 3\r\nUser-Agent: python\r\nTransport: RTP/AVP;unicast;client_port=60784-60785\r\n\r\n"
play="PLAY rtsp://admin:12345@192.168.1.74/ RTSP/1.0\r\nCSeq: 5\r\nUser-Agent: python\r\nSession: SESID\r\nRange: npt=0.000-\r\n\r\n"
# .. here SESID will be substituted with the session id that SETUP returns us ..
ip="192.168.1.74"
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((ip,554))
s.send(dest)
recst=s.recv(4096)
printrec(recst)
# etc. then the same for the strins "setu" and "play"
....
Run Code Online (Sandbox Code Playgroud)
安装程序回复我:
RTSP/1.0 200 OK
CSeq: 3
Session: 1117448817;timeout=60
Transport: RTP/AVP;unicast;client_port=60784-60785;server_port=8214-8215;ssrc=40d35c30;mode="play"
Date: Mon, …Run Code Online (Sandbox Code Playgroud) 我正在尝试将一些目标文件包含到我正在构建的共享库中。执行以下命令(为简洁起见,已省略 [ETC] 中的内容):
/usr/bin/c++ -fPIC -std=c++14 -pthread -Iinclude/ext/liveMedia -Iinclude/ext/groupsock [ETC] -g -shared -Wl,-soname,libValkka.so -o lib/libValkka .so CMakeFiles/Valkka.dir/src/avthread.cpp.o CMakeFiles/Valkka.dir/src/opengl.cpp.o [ETC] CMakeFiles/Valkka.dir/src/decoders.cpp.o -lX11 -lGLEW -lGLU -lGL -Wl,--whole-archive lib/libavcodec.a -Wl,--no-whole-archive
所以基本上我只是创建一个共享库,其中大部分对象来自我自己的源代码(即 CMakeFiles/Valkka.dir/src/*.o),但其中一些来自外部静态库,位于“lib /libavcodec.a”。我收到以下错误:
/usr/bin/ld: lib/libavcodec.a(h264_cabac.o): relocation R_X86_64_PC32针对符号'ff_h264_cabac_tables'在制作共享对象时不能使用;使用 -fPIC /usr/bin/ld 重新编译:最终链接失败:错误值 collect2:错误:ld 返回 1 退出状态
但这太不真实了!我可以提取“libavcodec.a”
ar x libavcodec.a
Run Code Online (Sandbox Code Playgroud)
在那之后检查
readelf --relocs h264_cabac.o | egrep '(GOT|PLT|JU?MP_SLOT)'
Run Code Online (Sandbox Code Playgroud)
确实给了一些**它:
00000000175d 003100000004 R_X86_64_PLT32 0000000000000000 __stack_chk_fail - 4 000000001926 0031000000004 R_000000006_4 000000000006_000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000心
...
就像
objdump -r h264_cabac.o | grep -i "relocation"
Run Code Online (Sandbox Code Playgroud)
因此,实际上,“libavcodec.a”中的目标文件已经被编译为获得 PIC(位置无关代码)。
为什么链接器不相信!?
相关链接:
我试图找出/调整网络缓冲区的大小:
import socket
sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
sock.getsockopt(socket.SOL_SOCKET,socket.SO_RCVBUF)
212992
Run Code Online (Sandbox Code Playgroud)
这究竟是什么?~0.2 MBytes ..!?
但是,如果我在其他地方寻找缓冲区大小,即在命令行上:
sampsa@sampsa-xps13:~/python/sockets$ cat /proc/sys/net/ipv4/tcp_wmem
4096 16384 4194304
Run Code Online (Sandbox Code Playgroud)
..我得到4096字节.
让我们尝试设置缓冲区大小,然后检查它的值:
sock.setsockopt(socket.SOL_SOCKET,socket.SO_RCVBUF,1024)
sock.getsockopt(socket.SOL_SOCKET,socket.SO_RCVBUF)
2304
Run Code Online (Sandbox Code Playgroud)
这是怎么回事?
用SOL_UDP替换SOL_SOCKET会出现"Protocol not available"
我怎样才能调整最大值 UDP数据包的大小..甚至找到它?
这个问题是关于在同一主机内发送和接收多播,同时将其发送到其他主机。
即使经过数小时的谷歌搜索,我也无法弄清楚如何在同一主机内路由多播数据报..!
下面是问题的详细描述:
Linux 机器“A”通过电缆连接到交换机/路由器(我们称交换机/路由器为“R”)。
在 linux box A 中,我有一个进程(A0)将 UDP 数据包发送到多播地址“224.0.0.0”,端口 5000。
同样,在同一个框 A 中,我有两个进程(A1 和 A2),都连接到 224.0.0.0、端口 5000 并消耗 UDP 数据包。
现在,box A 中的内核如何管理路由?
因此,A0 发送了一个数据报,该数据报被 A1 和 A2 消费。这样的数据报是否进行往返 A --> R --> A ?
.. 或者“A”中的内核路由是否足够智能以避免这种不必要的往返?(即数据报由 A0 发送并立即被 A1 和 A2 消耗,永远不会离开 A)。
当然,可以通过为多播创建和强制执行环回设备来确保多播数据报永远不会离开 A:
sudo ifconfig lo multicast
sudo route add -net 224.0.0.0 netmask 240.0.0.0 dev lo
Run Code Online (Sandbox Code Playgroud)
但是现在,如果我想在另一个 linux 机器中同时使用 UDP 数据报,比如说“B”,它们就无法到达那里。
因此,理想情况下,(1)在 A 中消耗的数据报永远不应该离开 A(即没有往返 A --> R --> A),而(2)在 B 中消耗的数据报应该正常地作为 A --> …
正如主题所建议的,我想知道是否可以在分段 MP4 直播流中定期发送有关流内容的元数据。
我使用以下命令 (1) 来获取碎片 MP4:
ffmpeg -i rtsp://admin:12345@192.168.0.157 -c:v copy -an -movflags empty_moov+omit_tfhd_offset+frag_keyframe+default_base_moof -f mp4 ...
Run Code Online (Sandbox Code Playgroud)
我的主程序从标准输出或(unix 域)套接字读取此命令的片段并获取:
ftyp
moov
moof
mdat
moof
mdat
moof
mdat
...
Run Code Online (Sandbox Code Playgroud)
因此,我得到的第一个片段是ftyp和moov,它们是元数据并描述流内容。
现在,客户端程序稍后连接到主程序。问题是,那时ftype和moov片段早已消失。
有没有办法(= ffmpeg 命令选项)使这项工作类似于 MPEGTS(又名 mpeg 传输流),并定期与流一起重新发送元数据? 像这样:
ftyp
moov
moof
mdat
moof
mdat
moof
mdat
ftyp
moov
moof
mdat
moof
mdat
moof
mdat
...
Run Code Online (Sandbox Code Playgroud)
.. 或者是我在主程序中缓存ftyp和moov数据包并在请求流时将它们重新发送到客户端程序的唯一选择?
相关链接:Fragmented …
正如标题所示。
我很难找到一个合适的 python dbus 模块。路上有很多烟雾、镜子和陷阱。
首先,让我们看看我做了什么。
第一个诱杀装置是dbus-python。根本无法让它工作。甚至连例子都被破坏了。
好像已经过时了,被pydbus取代了
(两者的版权所有者/作者似乎是相同的)
那我们来看看 pydbus 吧。另外,这些例子的效果也不是很好:
from pydbus import SystemBus
bus = SystemBus()
dev = bus.get('.NetworkManager', 'Devices/0')
Run Code Online (Sandbox Code Playgroud)
给出
KeyError: 'object does not export any interfaces; you might need to pass object path as the 2nd argument for get()'
Run Code Online (Sandbox Code Playgroud)
然而,如果我们尝试一些与该错误消息完全相反的东西..
dev = bus.get('.NetworkManager')
Run Code Online (Sandbox Code Playgroud)
我们得到了一个带有很多方法的漂亮对象:
dir(dev)
['ActivateConnection',
'ActivatingConnection',
'ActiveConnections',
'AddAndActivateConnection',
'AllDevices',
'Capabilities',
'CheckConnectivity',
'CheckPermissions',
'CheckpointCreate',
'CheckpointDestroy',
'CheckpointRollback',
'Connectivity',
....
]
Run Code Online (Sandbox Code Playgroud)
到目前为止,一切都很好。让我们看看我们是否可以使用蓝牙:
dev = bus.get('org.bluez')
dir(dev)
['Introspect',
'RegisterAgent',
'RegisterProfile',
'RequestDefaultAgent',
'UnregisterAgent',
'UnregisterProfile'
]
Run Code Online (Sandbox Code Playgroud)
所以,这又是一个带有一些方法的好对象。然而大部分东西都不见了。让我们看一下这个例子: …
我正在while循环中从UDP套接字读取数据.我需要最有效的方法
1)读取数据(*)(这种解决方式,但评论意见)
2)定期将(操纵的)数据转储到文件中(**)(问题)
我期待numpy的"tostring"方法的瓶颈.让我们考虑下面一段(不完整的)代码:
import socket
import numpy
nbuf=4096
buf=numpy.zeros(nbuf,dtype=numpy.uint8) # i.e., an array of bytes
f=open('dump.data','w')
datasocket=socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# ETC.. (code missing here) .. the datasocket is, of course, non-blocking
while True:
gotsome=True
try:
N=datasocket.recv_into(buf) # no memory-allocation here .. (*)
except(socket.error):
# do nothing ..
gotsome=False
if (gotsome):
# the bytes in "buf" will be manipulated in various ways ..
# the following write is done frequently (not necessarily in each pass of the while loop):
f.write(buf[:N].tostring()) # …Run Code Online (Sandbox Code Playgroud)