我试图使用带有 ipv6 地址的 opencv 的视频捕获功能从我的树莓派流式传输到我的 debian 虚拟机,但当我尝试时,标题中出现错误。
我已经确认 ipv6 地址可以通过 netcat 和 mplayer 访问
,如下所示:Debian 主机:
网猫 -L -6 -U 2222
树莓派:
/opt/vc/bin/raspivid -t 0 -w 300 -h 300 -hf -fps 20 -o - | NC -U (IPv6 地址) 2222
法典:
VideoCapture vcap;
const string videoStreamAddress = "udp://" + "(my Ipv6 address)" + ":2222";
vcap.open(videoStreamAddress);
编辑:我已经确认 vcap.open 可以使用 127.0.0.1 工作,但问题是它仍然不适用于我的 ipv6 地址
<protocol>://
> 以您指定的格式使用的 IPv6 地址需要括在括号中([
和]
)。这最初在RFC 2732, URL 中文字 IPv6 地址的格式中指定,并在RFC 3896: 统一资源标识符 (URI): 通用语法中继续指定:
3.2.2. 主机
授权的主机子组件由 IP 文字标识 封装在方括号内,点状 IPv4 地址 十进制形式或注册名称。主机子组件是案例 感觉迟钝的。 URI 中存在主机子组件不会 暗示该方案需要访问给定主机上的主机 互联网。在许多情况下,主机语法仅用于 重用为 创建和部署的现有注册过程 DNS,从而获得全局唯一的名称,而无需花费 部署另一个注册表。但是,这种使用有其自身的 成本:域名所有权可能会随着时间的推移而发生变化,原因不是 由 URI 生产者预期。在其他情况下,数据中的 主机组件标识与无关的注册名称 与互联网主机。 我们使用名称"host"作为 ABNF 规则 因为这是它最常见的目的,而不是它的唯一目的。
host = IP-literal / IPv4address / reg-name
主机的语法规则不明确,因为它不完全 区分 IPv4 地址和注册名称。为了 消除语法歧义,我们应用"先匹配获胜"算法:如果 主机与 IPv4 地址的规则匹配,那么它应该被视为 IPv4 地址文字,而不是注册名称。 虽然主人是 不区分大小写,生成者和规范化器应使用小写字母 为了统一起见,注册名称和十六进制地址, 而仅使用大写字母进行百分比编码。
由因特网协议文字地址标识的主机,版本 6 [RFC3513] 或更高版本,通过将 IP 文本括起来区分 在方括号内("["和"]")。这是唯一一个地方 URI 语法中允许使用方括号字符。在 对未来尚未定义的 IP 文字地址格式的预期, 实现可以使用可选的版本标志来指示此类 显式格式,而不是依赖于启发式确定。
IP-literal = "[" ( IPv6address / IPvFuture ) "]" IPvFuture = "v" 1*HEXDIG "." 1*( unreserved / sub-delims / ":" )
版本标志不指示 IP 版本;相反,它 指示文本格式的未来版本。因此, 实现不得为现有 IPv4 和 IPv6 文字地址形式如下所述。如果 URI 包含以"v"开头的 IP 文本(不区分大小写), 指示版本标志存在,由 不知道该版本标志含义的应用程序,则 应用程序应为"地址"返回相应的错误 机制不受支持"。
由 IPv6 文本地址标识的主机在 没有前面版本标志的方括号。ABNF提供 这是IPv6文字文本定义的翻译 [RFC3513] 中提供的地址。此语法不支持 IPv6 作用域寻址区域标识符。
一个 128 位 IPv6 地址分为八个 16 位部分。每件 以不区分大小写的十六进制以数字表示,使用 四个十六进制数字(允许使用前导零)。八 编码片段首先给出最有效,用冒号分隔 字符。(可选)最不重要的两个部分可以改为 以 IPv4 地址文本格式表示。一个或 地址中多个连续的零值 16 位片段可能是 省略,省略所有数字并留下两个连续的数字 冒号代替以标记省略号。
IPv6address = 6( h16 ":" ) ls32 / "::" 5( h16 ":" ) ls32 / [ h16 ] "::" 4( h16 ":" ) ls32 / [ *1( h16 ":" ) h16 ] "::" 3( h16 ":" ) ls32 / [ *2( h16 ":" ) h16 ] "::" 2( h16 ":" ) ls32 / [ *3( h16 ":" ) h16 ] "::" h16 ":" ls32 / [ *4( h16 ":" ) h16 ] "::" ls32 / [ *5( h16 ":" ) h16 ] "::" h16 / [ *6( h16 ":" ) h16 ] "::" ls32 = ( h16 ":" h16 ) / IPv4address ; least-significant 32 bits of address h16 = 1*4HEXDIG ; 16 bits of address represented in hexadecimal
由 IPv4 文本地址标识的主机表示为 点分十进制表示法(四个十进制数字的序列,其中 范围 0 到 255,用"."分隔),如 [RFC1123] 中所述 参考 [RFC0952]。请注意,其他形式的虚线表示法可能 在某些平台上进行解释,如第 7.4 节所述,但仅允许四个八位字节的点分十进制形式 语法。
IPv4address = dec-octet "." dec-octet "." dec-octet "." dec-octet dec-octet = DIGIT ; 0-9 / %x31-39 DIGIT ; 10-99 / "1" 2DIGIT ; 100-199 / "2" %x30-34 DIGIT ; 200-249 / "25" %x30-35 ; 250-255
由注册名称标识的主机是一系列字符 通常用于在本地定义的主机或服务中进行查找 名称注册表,尽管 URI 的方案特定语义可能需要 改用特定的注册表(或固定名称表)。这 最常见的域名注册机制是域名系统 (DNS)。一个 用于在 DNS 中查找的注册名称使用定义的语法 在[RFC1034]的第3.5节和[RFC1123]的第2.1节中。这样的名字 由一系列以"."分隔的域标签组成,每个域 标签以字母数字字符开头和结尾,可能以字母数字字符开头和结尾 还包含"-"字符。 完全最右边的域标签 DNS 中的限定域名后可以跟一个"." 和 应该是如果有必要区分完整的 域名和一些本地域名。
reg-name = *( unreserved / pct-encoded / sub-delims )
如果 URI 方案定义了主机的默认值,则该默认值 当主机子组件未定义或已注册时适用 名称为空(零长度)。例如,"文件"URI 方案是 定义为没有权限、空主机和"本地主机"都意味着 最终用户的计算机,而"HTTP"方案认为缺少 权限或空主机无效。
此规范不强制要求特定的注册名称 查找技术,因此不限制 reg- 的语法 超出互操作性所需的名称。相反,它 将注册名称语法一致性问题委托给 执行 URI 解析的每个应用程序的操作系统,以及 该操作系统决定它将允许用于以下目的 主机标识。URI 解析实现可能使用 DNS, 主机表、黄页、NetInfo、WINS 或任何其他系统 查找注册名称。 但是,全局范围的命名系统, 例如 DNS 完全限定域名,对于 URI 是必需的 旨在具有全球范围。URI 生成者应使用以下名称 符合 DNS 语法,即使不是立即使用 DNS 明显,并且应将这些名称限制为不超过 255 个字符 在长度上。
reg-name 语法允许使用百分比编码的八位字节,以便 以统一的方式表示非 ASCII 注册名称,即 独立于基础名称解析技术。非 ASCII 字符必须首先根据 UTF-8 [STD63] 进行编码,然后 相应 UTF-8 序列的每个八位字节必须是百分比 编码为表示为 URI 字符。URI 生成 应用程序不得在主机中使用百分比编码,除非已使用 表示 UTF-8 字符序列。当非 ASCII 注册时 名称表示国际化域名,用于 通过 DNS 解析,名称必须转换为 IDNA 在名称查找之前编码 [RFC3490]。URI 生产者应提供 这些注册名称采用 IDNA 编码,而不是 百分比编码,如果他们希望最大化互操作性 旧版 URI 解析程序。