尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

FFmpeg6操作 RTMP参数详解

FFmpeg6操作 RTMP参数详解 目录一、RTMP 在 FFmpeg 里的两层模型二、URL 解析规则先搞清 app / playpath三、Native RTMP 协议参数FFmpeg 内置非 librtmp连接与握手类直播语义类最重要传输层FFmpeg 6 新增四、FLV 封装层参数和 RTMP 强绑定五、输入/输出通用鲁棒性参数推流端拉流端六、标准命令模板文件推直播H264/AACRTSP → RTMP 转推拉 RTMP 存本地带 token 的 CDN 推流七、Native RTMP vs librtmp编译期二选一八、代码层libavformat设置要点九、最常见 5 个坑按出现频率十、一句话速查觉得有用就请您帮忙点赞转发收藏吧您的鼓励是我创作的动力多谢看官。由于能力水平有限文中的错误或不严谨的地方在所难免还请批评指正。在FFmpeg中使用RTMP协议进行视频直播时你需要了解一些基本的参数设置以确保你的视频流可以顺利传输到目标服务器。RTMPReal Time Messaging Protocol是一种网络协议用于实现流媒体数据的传输。在FFmpeg中使用RTMP协议进行视频直播通常涉及到以下几个关键步骤和参数。一、RTMP 在 FFmpeg 里的两层模型输入/输出 URL: rtmp://host:port/app/playpath │ ├── 协议层 (rtmpproto.c / 或 librtmp) │ └── rtmp_app / rtmp_playpath / rtmp_live / rtmp_buffer ... │ └── 封装层 (flvenc.c / flvdec.c) └── -f flv / -flvflags no_duration_filesize推流必须显式-f flv或代码里avformat_alloc_output_context2(ctx, NULL, flv, url)否则 FFmpeg 会猜格式直播场景必炸。二、URL 解析规则先搞清 app / playpathrtmp://user:passhost:1935/app/playpath段含义备注user:pass推流鉴权部分服务器用tokenxxx 也行host:port默认 1935app应用名live / vod / ingest可用rtmp_app覆盖playpath流名streamKey可带mp4:前缀可用rtmp_playpath覆盖等价写法rtmp://srv/live/room1 # -rtmp_app live -rtmp_playpath room1 rtmp://srv三、Native RTMP 协议参数FFmpeg 内置非 librtmp通过-option value或AVDictionary设置重点记这些连接与握手类rtmp_app​覆盖 URL 里的 app 名。服务器有“隐式 app”时必用。rtmp_playpath​覆盖流名。SRS 常配合?vhost使用。rtmp_tcurl​Connect 时发的 tcUrl默认rtmp://host:port/app。某些 CDN旧版 FMS校验严格必须手动设。rtmp_pageurl / rtmp_swfurl / rtmp_swfverify / rtmp_swfhash / rtmp_swfsize​SWF 防盗链验证三件套。rtmp_swfverify最省事给 URL 自动算 hash。rtmp_flashver​模拟 Flash 版本串。拉流默认LNX 9,0,124,2推流默认FMLE/3.0 (compatible; )。老 FMS 拒连时改这个。rtmp_conn​往 Connect AMF 里塞自定义字段-rtmp_conn S:tokenabc O:1 NS:info:ok O:0Bbool / Nnumber / Sstring / Oobject / Znull直播语义类最重要rtmp_live​any默认先找直播没有就播录制live只播直播找不到直接失败拉直播必设recorded只播点播拉流命令等价旧写法rtmp://... live1rtml_buffer​客户端缓冲ms默认3000。低延迟场景调到0~500弱网回源可加到6000。rtmp_subscribe​订阅名默认等于 playpath。rtmp_livelive时才发。rtmp_flush_interval​仅 RTMPTHTTP 隧道生效默认 10。传输层tcp_nodelay1​关 Nagle降延迟。配合-fflags nobuffer使用。listen / timeout​FFmpeg 自己当 RTMP 服务端rtmp://127.0.0.1:1935/live/foo?listen1FFmpeg 6 新增rtmp_enhanced_codecs​Enhanced RTMPRTMP over H265/AV1/VP9广告用-rtmp_enhanced_codecs hvc1,av01写进 Connect 的fourCcLive字段。四、FLV 封装层参数和 RTMP 强绑定RTMP 线格式 FLV tag 流所以这些 muxer 参数直接影响直播兼容性-f flv​强制 FLV。RTMP 输出不写这个90% 情况会失败。-flvflags no_duration_filesize​直播推流必加。不写 filesize/duration 到 metadata直播没有“文件尾”防止播放器等待 EOS 卡首帧。-flvflags aac_seq_header_detect​老播放器兼容 AAC 音频头。五、输入/输出通用鲁棒性参数推流端-re # 按输入帧率读文件转直播必加否则瞬间发完 -reconnect 1 -reconnect_at_eof 1 -reconnect_streamed 1 -reconnect_delay_max 5 # 源断自动重连 -max_interleave_delta 0 # 防止音视频交错超时断流 -bufsize 1M拉流端-fflags nobuffer -flags low_delay -rtbufsize 1M六、标准命令模板文件推直播H264/AACffmpeg -re -i in.mp4 \ -c:v h264 -b:v 2000k -g 50 -keyint_min 25 -sc_threshold 0 \ -c:a aac -b:a 128k -ar 44100 \ -f flv -flvflags no_duration_filesize \ rtmp://srv:1935/live/room1RTSP → RTMP 转推ffmpeg -rtsp_transport tcp -reconnect 1 -reconnect_delay_max 5 \ -i rtsp://cam/live \ -c:v libx264 -preset veryfast -tune zerolatency -fps_mode cfr -r 25 \ -c:a aac \ -f flv -flvflags no_duration_filesize \ rtmp://srv/live/cam1拉 RTMP 存本地ffplay rtmp://srv/live/room1 # 或 ffmpeg -rtmp_live live -i rtmp://srv/live/room1 -c copy out.flv带 token 的 CDN 推流ffmpeg -re -i in.flv \ -f flv -flvflags no_duration_filesize \ -rtmp_app live \ -rtmp_playpath room1?tokenxxxx \ -rtmp_tcurl rtmp://cdn.example.com/live \ rtmp://cdn.example.com七、Native RTMP vs librtmp编译期二选一维度FFmpeg native (rtmpproto)librtmp (--enable-librtmp)维护状态主线默认旧部分发行版仍带参数前缀rtmp_同名但解析器不同Enhanced RTMP6.x 支持不支持SWF verify支持支持RTMPS 加密依赖系统 TLS自带推荐新项目用 native​老 FMS 兼容才用两者不能同时存在编译时谁先配谁生效。八、代码层libavformat设置要点AVDictionary *opts NULL; av_dict_set(opts, rtmp_live, live, 0); av_dict_set(opts, rtmp_buffer, 500, 0); av_dict_set(opts, flvflags, no_duration_filesize, 0); av_dict_set(opts, reconnect, 1, 0); av_dict_set(opts, reconnect_delay_max, 5, 0); avformat_alloc_output_context2(oc, NULL, flv, url); avio_open2(oc-pb, url, AVIO_FLAG_WRITE, NULL, opts); avformat_write_header(oc, opts);flvflags是 muxer 私有选项必须走avformat_write_header的 options 或全局AVOption不能当协议选项塞错层。九、最常见 5 个坑按出现频率不写-f flv​ →Unknown format或服务器收不到音视频拉直播没设rtmp_live live​ → 播一会卡住等点播filesize 写进 metadata​ → 浏览器 flv.js 首帧等 EOSbuffer 默认 3000ms​ → 延迟肉眼可见低延迟忘了改用 librtmp 却传 Enhanced RTMP 参数​ → 直接忽略十、一句话总结RTMP 参数分三层URL 定路由 → rtmp_定握手/直播语义 → flv/flvflags 定封装兼容。直播推流铁三角-f flv -flvflags no_duration_filesize -rtmp_live live
返回列表