avformat_open_input返回-2(AVERROR_NOENT)主因是网络协议未注册,须在调用前执行avformat_network_init();若为HTTPS还需确保OpenSSL等TLS库可用。

ffmpeg\_avformat\_open\_input 为什么总是返回 -2(AVERROR\_NOENT)?
直接用 avformat_open_input 打开一个类似 "http://example.com/live.flv" 的 URL 失败,多数是因为 FFmpeg 默认不启用 HTTP 协议支持——它需要在编译时链接 libavformat 对应的协议模块,而很多预编译库(尤其是 Windows 上的静态二进制包)默认禁用 http 或 tls。不是地址写错了,是协议没注册。
实操上必须显式调用:
avformat_network_init(); // 必须在 avformat_open_input 前调用
否则哪怕 URL 格式完全正确,也会因找不到匹配的 AVInputFormat 而返回 -2。这个初始化会注册 http、https、rtmp 等网络协议,但不会自动加载 TLS 库(如 OpenSSL),若目标是 HTTPS 流,还需确保运行时能找到对应动态库(如 libssl-1_1.dll)。
怎么识别 FLV 流里的音视频轨道并正确复制时间基?
FLV 容器本身不携带全局时间基(AVStream.time_base 是 {0, 1}),所有 AVPacket.pts/dts 都基于毫秒级时间戳(即单位为 1/1000 秒)。如果直接把 packet 写入 MP4 或 MKV 文件,播放器会因时间基不匹配而卡顿或快进。
立即学习“C++免费学习笔记(深入)”;
正确做法是:在读取每个 packet 后,手动重标时间戳:
- 用
av_q2d(stream->time_base)拿到当前流原始时间基(对 FLV 来说通常无效,所以得靠上下文) - 实际中更可靠的是:假设输入 FLV 的 timestamp 字段单位是毫秒 → 统一设输出流
time_base = {1, 1000} - 再用
av_rescale_q_rnd()把 packet 的pts/dts从毫秒转为新 time_base 下的 ticks
漏掉这步,写出来的文件可能能播,但 seek 不准、倍速异常,尤其在 VLC 或 ffplay 里表现明显。
av_interleaved_write_frame 写文件时卡住或报错 -32(AVERROR_INVALIDDATA)?
常见于没有先写入头信息(header)就直接写 packet。FLV 文件虽是流式格式,但 FFmpeg 的 AVFormatContext 输出流程仍要求严格顺序:
- 调用
avformat_write_header()(对 FLV muxer 可传NULLoptions) - 再循环
av_interleaved_write_frame() - 最后
av_write_trailer()
另外注意:FLV muxer 不支持 B-frame 时间戳乱序,如果源流含 B 帧且 dts > pts,需在写入前调用 av_packet_rescale_ts() 对齐;否则 av_interleaved_write_frame 可能返回 -32 并中断写入。
还有一个隐藏坑:某些 FLV 直播源会在开头发一段不带音视频的 metadata(onMetaData),FFmpeg 会把它当作 AVSTREAM_TYPE_DATA 流。如果你只 copy 视频+音频流,得跳过这类 packet,否则写入会失败。
要不要用 avcodec_send_packet / avcodec_receive_frame 解码再重编码?
不需要。纯录制场景下,99% 的情况应该走 AV_CODEC_ID_COPY 路径——也就是不做解码,直接 av_packet_ref() 后写入输出文件。既省 CPU,又保画质和时序。
只有当你需要做以下操作时才解码:
- 修改分辨率或码率(比如降为 480p)
- 加滤镜(水印、裁剪)
- 修复时间戳错乱(极少数源流 PTS/DTS 严重跳跃)
否则强行 decode + encode 会引入额外延迟、丢帧风险,还可能因重编码参数设置不当导致文件体积暴增或兼容性下降。FLV 直播流本身已是 H.264/AAC 编码,直接 copy 最稳。
最易被忽略的一点:FLV 流可能中途断连或重定向,av_read_frame 返回 AVERROR_EOF 不代表结束,也可能是临时超时。生产环境必须检查返回值是否为负且非致命错误(如 AVERROR(EAGAIN) 或 AVERROR(ETIMEDOUT)),并配合重连逻辑,而不是直接退出写入循环。


















