我正在从一个产生大约20 MB / s的特殊设备读取数据
/dev/dvb/adapter0/dvr0
我需要阅读内容并复制到其他fifos
device_fd = os.open(video_device_file, os.O_RDONLY)
while True:
if jobm.has_jobs():
chunk = os.read( device_fd, 1024 * 1000 )
fifom.write2all(chunk)
jobm.idle()
运行一整晚后,我收到以下错误:
[Errno 75]对于已定义的数据类型,值太大
在os.read行中。
来自谷歌似乎与c库和32位指针有关但我不知道这会如何影响我的64位的python版本。
有什么建议吗?
答案 0 :(得分:1)
我不知道你的jobm
对象是什么,我认为它是由你创建的,因为这是类似对象的唯一Google结果,所以如果我错了就纠正我。
您似乎正在打开视频设备进行阅读,视频设备不断生成视频数据,而不是阅读它,您就是闲置。你似乎没有将device_fd
发送到你的工作,因此它无法知道fd上是否有活动,因此当你应该读取时它正在睡眠,这会产生缓冲区溢出。 / p>
如果有可用的话,您需要始终从device_fd
读取数据。将fd发送到jobm,并使用poll
或select
查找其中的活动。
编辑:对不起,我错过了你问题的细节。我所说的仍然适用,但不是直接的 - 你需要同时观察你的输入和输出,而不仅仅是你的输出,因为我已经说过了。
如果fifos无法处理输出,结果您错过了设备上的读取,则会出现问题。你需要1)创建一个缓冲区,它可以容纳数百MB的数据,以防管道写入迟到,2)丢弃数据包。如果缺少部分数据,DVB应用程序应该处理它。您也可以简单地捕获并忽略该异常,尽管它会导致轻微的损坏并在输出中丢失数据。