第八章那些格式与协议,跨三个大版本一个没少;rtmp 依然不是格式,设备接口也一个没多。 5.0 在流媒体上的增量是「基带级」的东西,日常推流用不上。
第八章讲过八种协议各自的让步,第十章讲过 Linux 上的采集与推流, 这一节只做复核:把 5.0 换成 7.x,那些结论还成不成立。
一、第八章那些格式,还在不在
第八章用到的格式与协议,本机逐个查一遍:
格式 本机有吗 第八章里它对应什么
flv 有 推 RTMP 时用的封装 hls 有 HLS 切片与 m3u8 mpegts 有 TS 流,UDP/RTP 的负载 rtsp 有 RTSP 控制协议 rtp 有 RTP 传输 sdp 有 会话描述,SPS/PPS 就写在里面 segment 有 按时间切段的输出 rtmp 没有 推流要写 -f flv,它不是格式
除了 rtmp 那一行,其余全在。
而 rtmp 的「没有」正是第八章那条结论的再次确认:
FFmpeg 里从来没有一个叫 rtmp 的容器格式——
RTMP 是传输协议,封装用的是 FLV。
换 5.0、换 8.0,这一条都不会变,因为它不是版本问题,是设计如此。
二、设备接口那边,一个都没多
Linux 那四个采集接口,本机全报 ValueError:
接口 本机 它是什么
v4l2 ValueError Linux 摄像头 alsa ValueError Linux 话筒 x11grab ValueError Linux 桌面 fbdev ValueError 帧缓冲设备
这跟第九章、第十章量到的一模一样。 说明「5.0 会不会让 Linux 采集变样」这种担心是多余的: 能不能采,取决于这套二进制在哪个平台上编、带了哪些开关, 跟它自称 5.0 还是 8.0 没有关系。
这里再重复一遍第九章那条判据,因为它太省时间了:
ValueError: no container format 是「这套里没这个接口」,
OSError 是「有这个接口但这台机器没这个设备」。
前者换平台或换构建,后者插设备。搞混了会一直往错的方向修。
三、那 5.0 在流媒体上到底加了什么
按官方公告,跟流媒体沾边的增量主要这四条:
5.0 的增量 什么样的人会用到
RTP 打包未压缩视频(RFC 4175) 做广播级基带传输的 concatf 协议 要按文件列表拼输入的高级用法 Vulkan 大改 想用 GPU 做滤镜链的 杜比视界支持 做 HDR 片源与转封装
这四条都不是「原先不能推流、现在能推了」级别的变化—— 原先该能推的,4.x 就能推。 所以书上那节「用 FFmpeg 5.0 实现流媒体及直播功能」, 真正要看的不是「5.0 多了什么」,而是「你手上这套到底带没带那几个开关」。
RTP 打包未压缩视频这一条值得多看一眼,因为它代表一个方向:
专业广播里,摄像机到切换台之间常常不压缩,直接用 RTP 传基带。
FFmpeg 5.0 开始支持这种传法,等于把手伸进了原来只有专业设备才碰的领域。
日常做直播的人用不上,但知道「FFmpeg 能到这一层」,对判断它的能力边界有用。
四、跨版本排查的顺序
直播这条链上出问题,按这个顺序查,比乱试快得多:
顺序 查什么 用什么查
一 这套有没有要用的格式/协议 ffmpeg -formats 二 有没有要用的编码器 ffmpeg -encoders 三 有没有要用的设备接口 ffmpeg -devices 四 服务器那头收没收到 服务端日志/抓端口
一二三都是本机一个命令能查的,第四步必须看对面。
第八章反复强调过:推流到不存在的服务器时,客户端从头到尾一声不吭,
open 不报、mux 不报、close 也不报,几个毫秒就安静跑完。
所以「客户端没报错」这件事,在直播这条链上一文不值。
这也解释了为什么这四步里「三」最常被跳过:
设备接口不在,ffmpeg 会在打开输入时就失败,报的却是一句 ValueError,
看着像参数问题。
先查一次 ffmpeg -devices,能省掉半天的瞎猜。
五、这一章真正带走的东西
六节读下来,其实只有一句话: 版本号决定「有哪些功能被支持」,编译开关决定「哪些功能真的在里面」。
所以遇到「书上有、我这儿没有」的情况,顺序应该是:
先查清单(-filters/-formats/-encoders/-devices),
再判断是「没编进来」还是「没插设备」,最后才去怀疑参数。
把顺序倒过来,就会一直在参数里绕圈子。
下面就要进入第十二章:用 C++、Java、Python 去调用这条命令行。
那一章的所有代码都建立在一个前提上——
你手上这套 ffmpeg 真的能跑通你要的那条命令。
所以这一章最后这个习惯,是下一章的地基。
六、动手 Demo:格式与设备的跨版本复核
下面这段把第八章用到的格式查一遍,再逐个试开四个 Linux 采集接口。 两件事拼在一起,正好是直播链路的前三步。
import av
FM = set(av.formats_available)
for nm in ("flv", "hls", "mpegts", "rtsp", "rtp", "sdp", "rtmp"):
print(" %-8s %s" % (nm, "有" if nm in FM else "没有"))
print("--- 设备接口")
for nm, arg in (("v4l2", "/dev/video0"), ("alsa", "default"),
("x11grab", ":0.0"), ("fbdev", "/dev/fb0")):
try:
c = av.open(arg, format=nm)
print(" %-8s 能开" % nm)
c.close()
except Exception as e:
print(" %-8s %s" % (nm, type(e).__name__))
实跑输出:
--------------------------------------------------------------------
11.5 使用 FFmpeg 5.0 实现流媒体及直播功能
--------------------------------------------------------------------
**① 第八章那些格式,跨三个大版本还在不在**
**第八章用到的东西全在格式清单里,本机逐个查一遍:**
格式 本机有吗 第八章里它对应什么
------------------------------------------------------------
flv 有 推 RTMP 时用的封装
hls 有 HLS 切片与 m3u8
mpegts 有 TS 流,UDP/RTP 的负载
rtsp 有 RTSP 控制协议
rtp 有 RTP 传输
sdp 有 会话描述,SPS/PPS 就写在里面
segment 有 按时间切段的输出
rtmp 没有 推流要写 -f flv,它不是格式
**`rtmp` 那一行的「没有」,就是第八章那条结论的再次确认:**
**FFmpeg 里从来没有一个叫 `rtmp` 的容器格式,**
**RTMP 是传输协议,封装用的是 FLV。**
**换 5.0、换 8.0,这一条都不会变——因为它不是版本问题,是设计如此。**
**② 设备接口那边更明显:一个都没多**
接口 本机 说明
------------------------------------------------------
v4l2 ValueError Linux 摄像头
alsa ValueError Linux 话筒
x11grab ValueError Linux 桌面
fbdev ValueError 帧缓冲
**四个全是 `ValueError`,跟第九章、第十章量到的一模一样。**
**这说明「5.0 会不会让 Linux 采集变样」这种担心是多余的:**
**能不能采,取决于这套二进制在哪个平台上编、带了哪些开关,**
**跟它自称 5.0 还是 8.0 没有关系。**
**③ 那 5.0 在流媒体上到底加了什么**
5.0 的增量 什么样的人会用到
--------------------------------------------------------------
RTP 打包未压缩视频(RFC 4175) 做广播级基带传输的
concatf 协议 要按文件列表拼输入的高级用法
Vulkan 大改 想用 GPU 做滤镜链的
杜比视界支持 做 HDR 片源与转封装
**这四条都不是「原先不能推流、现在能推了」级别的变化——**
**原先该能推的,4.x 就能推。**
**所以书上那节「用 FFmpeg 5.0 实现流媒体及直播功能」,**
**真正要看的不是「5.0 多了什么」,而是「你手上这套到底带没带那几个开关」。**
格式那七行里只有 rtmp 是「没有」,其余全在。
这个「没有」不是缺陷,是设计:RTMP 是协议,不是容器。
设备那四行全 ValueError,跟第九章、第十章量到的一模一样。
换版本不会让 Linux 接口凭空出现——它要在 Linux 上编,还得开对应的开关。
30 秒实验
- 把
rtmp换成flv再跑:确认「换个名字就有」这件事。 - 加上
-devices那一列查法:在 Linux 上用ffmpeg -devices看真实清单。 - 把七个格式按「容器」和「协议」分个类:体会他们本来就不是一类东西。
常见误区
- 看到格式清单里没有
rtmp就以为不能推流。用-f flv推。 - 以为升到新版本 Linux 接口就出现了。要看平台和编译开关。
- 靠「客户端没报错」判断推流成功。对面收没收到才是唯一标准。
自测三问(点开对答案)
1. 为什么格式清单里没有 `rtmp`? —— RTMP 是传输协议不是容器格式,封装用 FLV。 2. 直播链路排查的前三步查什么? —— 格式/协议、编码器、设备接口,三个本机命令都能查。 3. 为什么不能靠客户端报错判断推流成功? —— 推流到不存在的服务器时,客户端 open/mux/close 全都不报错。- ☐ 11.5 完——第十一章收官,下一章 12.1 C++ 调用 FFmpeg 命令行