<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Multimedia on LingHui 的技术笔记</title><link>https://plhwiki.cn/multimedia/</link><description>Recent content in Multimedia on LingHui 的技术笔记</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Sun, 26 Jul 2026 15:13:45 +0800</lastBuildDate><atom:link href="https://plhwiki.cn/multimedia/index.xml" rel="self" type="application/rss+xml"/><item><title/><link>https://plhwiki.cn/multimedia/v4l2/</link><pubDate>Sun, 26 Jul 2026 15:13:45 +0800</pubDate><guid>https://plhwiki.cn/multimedia/v4l2/</guid><description>&lt;h1 id="v4l2-框架核心概念"&gt;V4L2 框架核心概念&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Video for Linux 2 (V4L2)&lt;/strong&gt; 是 Linux 内核中处理视频设备的标准框架，用于统一管理摄像头、视频采集卡等设备。设计 V4L2 框架的核心目的（思想）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;用户空间和内核空间分离&lt;/strong&gt;：应用通过标准系统调用与内核交互&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;设备抽象&lt;/strong&gt;：所有视频设备通过 &lt;code&gt;/dev/videoX&lt;/code&gt; 节点暴露&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;缓冲区队列管理&lt;/strong&gt;：通过 &lt;code&gt;vb2_queue&lt;/code&gt; 实现高效的零拷贝数据传输&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;v4l2_device&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;device&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;media_device&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;mdev&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;list_head&lt;/span&gt; &lt;span class="n"&gt;subdevs&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;spinlock_t&lt;/span&gt; &lt;span class="n"&gt;lock&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;notify&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;v4l2_subdev&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;sd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;notification&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;arg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;v4l2_ctrl_handler&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ctrl_handler&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;v4l2_prio_state&lt;/span&gt; &lt;span class="n"&gt;prio&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;kref&lt;/span&gt; &lt;span class="n"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;release&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;v4l2_device&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;v4l2_dev&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;获取当前的格式&lt;/p&gt;</description></item><item><title/><link>https://plhwiki.cn/multimedia/protocol/gb28181/</link><pubDate>Mon, 13 Jul 2026 20:01:13 +0800</pubDate><guid>https://plhwiki.cn/multimedia/protocol/gb28181/</guid><description>&lt;h1 id="gb28181协议"&gt;GB28181协议&lt;/h1&gt;
&lt;p&gt;GB28181协议会话通道实际上使用的是SIP协议，并且在SIP协议的基础之上做了些私有化处理。SIP是一个由IETF MMUSIC工作组开发的协议，作为标准被提议用于创建，修改和终止包括视频，语音，即时通信，在线游戏和虚拟现实等多种多媒体元素在内的交互式用户会话。SIP中一个比较重要的概念是&lt;strong&gt;用户代理（User Agent）&lt;/strong&gt;，指的是一个SIP逻辑网络端点，用于创建、发送、接收SIP消息并管理一个SIP会话。SIP用户代理又可分为用户代理客户端UAC（User Agent Client）和用户代理服务端UAS（User Agent Server）。UAC创建并发送SIP请求，UAS接收处理SIP请求，发送SIP响应。SIP协议会与许多其它的协议协同工作，如SIP报文内容发送会话描述协议（Session Description Protocol，SDP）4，SDP协议描述了会话所使用流媒体细节，如：使用哪个IP端口，采用哪种编解码器等等。SIP的一个典型用途是：SIP会话传输一些简单的经过报文的实时传输协议流，RTP本身才是语音或视频的载体。在GB28181协议中，联网系统在进行视音频传输及控制时应建立两个传输通道: 会话通道和媒体流通道。会话通道用于在设备之间建立会话并传输系统控制命令; 媒体流通道用于传输视音频数据， 经过压缩编码的视音频流采用流媒体协议RTP/RTCP传输。GB28181协议中具体通信协议结构图如下图所示：&lt;/p&gt;</description></item><item><title/><link>https://plhwiki.cn/multimedia/sip/</link><pubDate>Mon, 13 Jul 2026 20:01:13 +0800</pubDate><guid>https://plhwiki.cn/multimedia/sip/</guid><description>&lt;h1 id="sip协议介绍"&gt;SIP协议介绍&lt;/h1&gt;
&lt;p&gt;​ SIP 是一个应用层的控制协议，可以用来建立、修改、和终止多媒体会话（或者会议）例如 Internet 电话/视频会议系统&lt;/p&gt;</description></item><item><title/><link>https://plhwiki.cn/multimedia/protocol/media_protocol/</link><pubDate>Thu, 18 Jun 2026 17:50:55 +0800</pubDate><guid>https://plhwiki.cn/multimedia/protocol/media_protocol/</guid><description>&lt;h1 id="流媒体协议"&gt;流媒体协议&lt;/h1&gt;
&lt;p&gt;&lt;img src="https://plhwiki.cn/multimedia/protocol/assets/image-20260520092716153.png" alt="image-20260520092716153" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;RTSP 在上层&lt;strong&gt;发号施令&lt;/strong&gt;（管控制），RTP 在底层&lt;strong&gt;埋头搬砖&lt;/strong&gt;（运数据），RTCP 在旁边&lt;strong&gt;盯着质量&lt;/strong&gt;（做监督）&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;三者关系：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;RTSP (应用层)：&lt;/strong&gt; &lt;strong&gt;流媒体的“遥控器”。&lt;/strong&gt; 它不传数据，只负责播放、暂停、快进和挂断等控制信令，并在正式传输前商量好底层数据通道的端口。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RTP (传输层/应用层)：&lt;/strong&gt; &lt;strong&gt;流媒体的“快递员”。&lt;/strong&gt; 它负责将庞大的音视频切片、打包、加上时间戳和序列号，然后通过 UDP 疯狂地发往目的地。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RTCP (应用层)：&lt;/strong&gt; &lt;strong&gt;流媒体的“质检员”。&lt;/strong&gt; 它不传数据，只在 RTP 旁边拉一条线，定期汇报丢包率和网络延迟。上层流媒体服务器（如 ZLMediaKit）根据它的反馈来决定是否降低码率或进行丢包重传（NACK）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在实际传输中，RTP 和 RTCP 就像连体婴儿，它们的网络端口是&lt;strong&gt;成对绑定&lt;/strong&gt;的：&lt;/p&gt;</description></item></channel></rss>