<?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://note.plhwiki.cn/multimedia/</link><description>Recent content in Multimedia on LingHui 的技术笔记</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Wed, 14 Oct 2026 20:01:02 +0800</lastBuildDate><atom:link href="https://note.plhwiki.cn/multimedia/index.xml" rel="self" type="application/rss+xml"/><item><title/><link>https://note.plhwiki.cn/multimedia/basic/basic/</link><pubDate>Wed, 14 Oct 2026 20:01:02 +0800</pubDate><guid>https://note.plhwiki.cn/multimedia/basic/basic/</guid><description>&lt;h1 id="未压缩的原始图像"&gt;未压缩的原始图像&lt;/h1&gt;
&lt;h2 id="yuv420"&gt;YUV420&lt;/h2&gt;
&lt;p&gt;YUV420是描述色度采样的方式&lt;/p&gt;
&lt;h3 id="nv12"&gt;NV12&lt;/h3&gt;
&lt;p&gt;NV12 属于 YUV420SP 格式，包含两个 Plane（平面）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Y Plane：亮度数据，每个像素一个 Y 分量。&lt;/li&gt;
&lt;li&gt;UV Plane：色度数据，U 和 V 交错存储，每个 2×2 像素块共用一组 UV。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;描述Y/U/V 数据在内存里怎么排：&lt;/p&gt;</description></item><item><title/><link>https://note.plhwiki.cn/multimedia/basic/framebuffer/</link><pubDate>Wed, 14 Oct 2026 20:01:02 +0800</pubDate><guid>https://note.plhwiki.cn/multimedia/basic/framebuffer/</guid><description>&lt;h1 id="分辨率"&gt;分辨率&lt;/h1&gt;
&lt;h2 id="显示分辨率"&gt;显示分辨率&lt;/h2&gt;
&lt;p&gt;也就是vo输出分辨率，最终HDMI真正输出给显示器的分辨率&lt;/p&gt;
&lt;h2 id="图形层分辨率"&gt;图形层分辨率&lt;/h2&gt;
&lt;p&gt;也就是framebuffer分辨率，应用程序实际绘图时使用的画布分辨率&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;图形层 framebuffer：1920 × 1080
↓
VO 硬件缩放
↓
HDMI 最终输出：3840 × 2160
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;视频层与图形层通常作为并行输入，由 VO 合成后输出，并非视频层先经过 framebuffer 图形层：&lt;/p&gt;</description></item><item><title/><link>https://note.plhwiki.cn/multimedia/protocol/gb28181/</link><pubDate>Wed, 14 Oct 2026 20:01:02 +0800</pubDate><guid>https://note.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://note.plhwiki.cn/multimedia/protocol/media_protocol/</link><pubDate>Wed, 14 Oct 2026 20:01:02 +0800</pubDate><guid>https://note.plhwiki.cn/multimedia/protocol/media_protocol/</guid><description>&lt;h1 id="流媒体协议"&gt;流媒体协议&lt;/h1&gt;
&lt;p&gt;&lt;img src="https://note.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;：控制播放、暂停和会话参数；RTP/RTCP 还可通过 RTSP 的 TCP 连接交错传输，不能理解为控制连接一定不承载媒体字节。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RTP&lt;/strong&gt;：封装媒体载荷、时间戳和序列号，常运行于 UDP 之上，也可使用 TCP 等承载；RTP 本身不保证可靠、有序或按时送达。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RTCP&lt;/strong&gt;：发送传输质量、同步和参与者信息；NACK 等反馈属于扩展机制，是否重传或调整码率由协议协商和实现决定。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;传统 RTP/UDP 会话通常使用偶数 RTP 端口及相邻的奇数 RTCP 端口，但这是常见约定。SDP 可以明确协商 RTCP 端口，rtcp-mux 还允许两者共用同一端口：&lt;/p&gt;</description></item><item><title/><link>https://note.plhwiki.cn/multimedia/v4l2/v4l2/</link><pubDate>Wed, 14 Oct 2026 20:01:02 +0800</pubDate><guid>https://note.plhwiki.cn/multimedia/v4l2/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;code&gt;/dev/v4l-subdevX&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://note.plhwiki.cn/multimedia/v4l2/v4l2%E6%A0%B8%E5%BF%83%E7%BB%93%E6%9E%84%E4%BD%93/</link><pubDate>Wed, 14 Oct 2026 08:00:22 -0400</pubDate><guid>https://note.plhwiki.cn/multimedia/v4l2/v4l2%E6%A0%B8%E5%BF%83%E7%BB%93%E6%9E%84%E4%BD%93/</guid><description>&lt;h1 id="核心结构体"&gt;核心结构体&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;核心组件作用&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;组件&lt;/th&gt;
&lt;th&gt;功能&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;video_device&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;设备节点注册（创建 &lt;code&gt;/dev/videoX&lt;/code&gt;）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;v4l2_device&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;设备逻辑管理（电源 / 子设备协调）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;vb2_queue&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;缓冲区队列管理（核心创新点）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;v4l2_subdev&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;子设备抽象（传感器 / ISP 等）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="struct-v4l2_buffer"&gt;struct v4l2_buffer&lt;/h2&gt;
&lt;p&gt;用来描述&amp;quot;一块视频缓冲区&amp;quot;的所有元信息。它的常用字段大致有：&lt;/p&gt;</description></item><item><title/><link>https://note.plhwiki.cn/multimedia/gstream/gstreamer/</link><pubDate>Sun, 04 Oct 2026 22:46:21 +0800</pubDate><guid>https://note.plhwiki.cn/multimedia/gstream/gstreamer/</guid><description>&lt;h1 id="命令测试"&gt;命令测试&lt;/h1&gt;
&lt;h2 id="播放视频"&gt;播放视频&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gst-play-1.0 --flags&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --videosink&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;fpsdisplaysink video-sink=xvimagesink signal-fps-measurements=true text-overlay=false sync=false&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --audiosink&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;alsasink device=hw:1,0&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; /root/nfs/test2.mp4
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="参数"&gt;&lt;strong&gt;参数&lt;/strong&gt;&lt;/h2&gt;
&lt;h3 id="flag"&gt;flag&lt;/h3&gt;
&lt;p&gt;这个参数控制 &lt;code&gt;playbin&lt;/code&gt; 开启哪些功能，本质上是一个 &lt;strong&gt;bit mask（位掩码）&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;bit 0 = 1 VIDEO
bit 1 = 2 AUDIO
bit 2 = 4 TEXT / subtitle
&lt;/code&gt;&lt;/pre&gt;&lt;blockquote&gt;
&lt;p&gt;flag=3 意味着开启视频和音频，但不启用字幕 TEXT。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title/><link>https://note.plhwiki.cn/multimedia/ffmpeg/ffmpeg/</link><pubDate>Wed, 30 Sep 2026 17:52:47 +0800</pubDate><guid>https://note.plhwiki.cn/multimedia/ffmpeg/ffmpeg/</guid><description>&lt;h1 id="ffmpeg-60编译"&gt;ffmpeg-6.0编译&lt;/h1&gt;
&lt;p&gt;把x264/x265 全部去掉，同时保留 MP4 写文件和音频转 AAC 所需的组件&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ./configure --prefix&lt;span class="o"&gt;=&lt;/span&gt;/home/meian/work/MyProject/ffmpeg/ffmpeg-6.0/out_Jz --arch&lt;span class="o"&gt;=&lt;/span&gt;mips --target-os&lt;span class="o"&gt;=&lt;/span&gt;linux --enable-cross-compile --cross-prefix&lt;span class="o"&gt;=&lt;/span&gt;mips-v720s229-linux-uclibc-gnu- --disable-asm --enable-pic --disable-debug --disable-programs --disable-ffmpeg --disable-ffprobe --disable-ffplay --disable-doc --disable-htmlpages --disable-manpages --disable-podpages --disable-txtpages --disable-symver --disable-iconv --disable-avfilter --disable-avdevice --disable-postproc --disable-indevs --disable-outdevs --disable-v4l2-m2m --disable-encoders --disable-decoders --disable-demuxers --disable-muxers --disable-parsers --disable-protocols --enable-decoder&lt;span class="o"&gt;=&lt;/span&gt;pcm_alaw --enable-decoder&lt;span class="o"&gt;=&lt;/span&gt;pcm_mulaw --enable-encoder&lt;span class="o"&gt;=&lt;/span&gt;aac --enable-parser&lt;span class="o"&gt;=&lt;/span&gt;h264 --enable-parser&lt;span class="o"&gt;=&lt;/span&gt;hevc --enable-muxer&lt;span class="o"&gt;=&lt;/span&gt;mp4 --enable-protocol&lt;span class="o"&gt;=&lt;/span&gt;file --extra-libs&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;-lpthread -lm&amp;#34;&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></channel></rss>