BTV

FLV 是 http 长连接,请求一次后服务器持续返回视频流数据。网络抖动断连需要重新连接 2RTT 额外延迟。flv 容器通过每帧的 tag 播放,无需等待延迟低。
HLS 是不断轮询的短请求序列,获取视频分片,等待切片延迟较大。hls 容器有时长和序列号,可以支持回退。fmp4 容器比 ts 容器的时间戳更精确,且使用索引文件保存初始化信息,每个分片精简。
https://www.cnblogs.com/yangchin9/p/18153222
https://blog.csdn.net/2301_79941386/article/details/154443573

MP4 重新封装核心步骤

  1. 创建 MP4 容器上下文 avformat_alloc_output_context2
  2. 首帧时间戳归零 avoid_negative_ts = AVFMT_AVOID_NEG_TS_MAKE_ZERO2. 复制原音视频流参数 avcodec_parameters_copy
  3. 配置 movflags = +faststart (moov前置)
  4. 寻找首个关键帧对齐 (丢弃开头残帧)
  5. 时间基重缩放 av_packet_rescale_ts 并写入
  6. 写入文件尾 av_write_trailer

CPU解码性能不足导致丢帧时怎么动态调整解码的策略?
FFmpeg 的 AVCodecContext 提供了专门应对算力不足的动态参数,在解码过程中就可以直接跳过高耗时运算,无需重启解码器:

  1. 跳过去块效应滤波:skip_loop_filter,关闭非关键帧(B 帧)的滤波
  2. 直接跳过“非参考帧”解码:skip_frame,跳过 B 帧的解码。
  3. 软解线程自适应调整,减少上下文切换。
  4. 跳 GOP 追赶
  5. 编解码格式降级、分辨率降级