小编El *_*psa的帖子

RTSP设置后接收RTP数据包

我正在尝试使用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)

python sockets udp rtp rtsp

8
推荐指数
1
解决办法
1万
查看次数

将对象从 C++ 存档 (.a) 包含到共享库中

我正在尝试将一些目标文件包含到我正在构建的共享库中。执行以下命令(为简洁起见,已省略 [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(位置无关代码)。

为什么链接器不相信!?

相关链接:

如何在共享对象中包含存档的所有对象?

将档案 (.a) …

c++ linker ffmpeg shared-libraries static-libraries

7
推荐指数
1
解决办法
1312
查看次数

用于在Python中读取UDP数据包的缓冲区大小

我试图找出/调整网络缓冲区的大小:

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数据包的大小..甚至找到它?

python sockets udp

6
推荐指数
1
解决办法
7550
查看次数

多播中的环回

这个问题是关于在同一主机内发送和接收多播,同时将其发送到其他主机。

即使经过数小时的谷歌搜索,我也无法弄清楚如何在同一主机内路由多播数据报..!

下面是问题的详细描述:

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 --> …

sockets router multicast loopback

6
推荐指数
1
解决办法
1万
查看次数

在分段实时 MP4 流中发送定期元数据?

正如主题所建议的,我想知道是否可以在分段 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)

因此,我得到的第一个片段是ftypmoov,它们是元数据并描述流内容。

现在,客户端程序稍后连接到主程序。问题是,那时ftypemoov片段早已消失。

有没有办法(= 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)

.. 或者是我在主程序中缓存ftypmoov数据包并在请求流时将它们重新发送到客户端程序的唯一选择?

相关链接:Fragmented …

mp4 ffmpeg live-streaming

6
推荐指数
1
解决办法
3835
查看次数

通过 python 和 dbus 使用蓝牙

正如标题所示。

我很难找到一个合适的 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)

所以,这又是一个带有一些方法的好对象。然而大部分东西都不见了。让我们看一下这个例子: …

python dbus bluetooth

4
推荐指数
1
解决办法
1万
查看次数

将Python中的字节从Numpy数组复制到字符串或bytearray中

我正在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)

python arrays buffer numpy

1
推荐指数
1
解决办法
2529
查看次数