当前位置: 首页 > article >正文

ffmpeg中格式转换需要注意点总结

某些封装格式(例如MP4/FLV/MKV等)的H.264码流的SPS和PPS信息存储在AVCodeccontext结构体的extradata中。分离某些封装格式(例如MP4/FLV/MKV等)中的H.264的时候,需要首先写入SPS和PPS,否则会导致分离出来的数据没有SPS、PPS而无法播。需要使用ffmpeg中名称为“h264 mp4toannexb”的bitstream filter处理

关键概念解析与操作指南


一、SPS/PPS 的作用与存储位置
  1. SPS (Sequence Parameter Set)
    定义视频序列的全局参数,包括分辨率、帧率、编码级别等。
  2. PPS (Picture Parameter Set)
    定义图像解码参数,如熵编码模式、分片参数等。
  3. 存储位置
    • 在 MP4/FLV/MKV 等封装格式中,SPS/PPS 通常存储在 ‌AVCodecContext->extradata‌ 中,而非嵌入到每个关键帧。
    • 裸 H.264 流(如 Annex B 格式)要求在每个关键帧(IDR帧)前携带 SPS/PPS。

二、问题根源分析

当直接从封装格式(如 MP4)中提取 H.264 裸流时:

  • 直接提取的缺陷‌:
    输出的 H.264 数据缺少 SPS/PPS 头部信息,导致播放器无法初始化解码器。
  • 典型报错‌:

    [h264 @ 0x7f8a5c006800] no frame! Invalid NAL unit size


三、解决方案:使用 Bitstream Filter

通过 FFmpeg 的 ‌h264_mp4toannexb‌ 比特流过滤器,实现以下功能:

  1. 从 extradata 提取 SPS/PPS‌:
    自动读取 AVCodecContext->extradata 中的参数集。
  2. 转换为 Annex B 格式‌:
    • 在码流起始位置插入 SPS/PPS。
    • 在每个关键帧前插入起始码 0x00000001 或 0x000001

四、操作命令示例

提取 MP4 中的 H.264 裸流并修复 SPS/PPS:

ffmpeg -i input.mp4 -c:v copy -bsf:v h264_mp4toannexb output.h264

  • 参数说明‌:
    • -c:v copy:直接复制视频流,不重新编码。
    • -bsf:v h264_mp4toannexb:对视频流应用比特流过滤器。

五、不同封装格式的适配
封装格式比特流过滤器作用
MP4h264_mp4toannexb插入 SPS/PPS,添加起始码
FLVh264_mp4toannexb同上(FLV 的 H.264 存储方式类似 MP4)
MKVh264_mp4toannexb同上
TS无需过滤器TS 流已符合 Annex B 格式

六、验证输出文件
  1. 使用 ffprobe 检查‌:

    ffprobe -v error -show_streams output.h264

    确认输出中包含 codec_tag_string=avc1 和 extradata
  2. 播放测试‌:

    ffplay output.h264


七、底层原理详解
  1. extradata 结构
    • MP4 中 extradata 的格式为 ‌AVCDecoderConfigurationRecord‌,包含 SPS/PPS 的二进制数据。
    • h264_mp4toannexb 过滤器解析此结构,将其转换为 Annex B 的头部。
  2. Annex B 格式要求
    • 每个 NAL 单元以起始码 0x00000001 或 0x000001 开头。
    • SPS/PPS 必须出现在码流开头或关键帧前。

八、扩展场景:处理多路流

若需合并多个 MP4 文件的 H.264 流,需对每个输入单独应用过滤器:

ffmpeg -i input1.mp4 -i input2.mp4 -filter_complex \ "[0:v]bsf=h264_mp4toannexb[0v];[1:v]bsf=h264_mp4toannexb[1v]; \ [0v][1v]concat=n=2:v=1" -c:v libx264 output_combined.mp4


通过上述方法,可确保提取的 H.264 裸流符合播放器要求,避免因缺失 SPS/PPS 导致的解码失败问题。

ffmpeg -i 1.mp4 -c:v copy output_without_sps_pps.h264转换完成后通过ffplay播放的h264为什么播放速度很快

问题原因解析

使用 ffmpeg -i 1.mp4 -c:v copy output.h264 转换的 H.264 裸流播放速度异常加快,主要与 ‌时间戳信息丢失‌ 和 ‌封装格式差异‌ 相关,具体原因如下:


1. ‌时间基(Timebase)未正确传递
  • MP4 容器特性‌:MP4 文件的时间戳基值(time_base)通常为 1/1000 或 1/90000,而 H.264 裸流无容器层,默认时间基可能被错误解析为 1/25 或 1/30[‌2][‌7]。
  • 播放器误判‌:ffplay 根据 H.264 裸流的 NAL 单元间隔推算帧率,若时间戳缺失或错误,会强制按默认高帧率(如 25fps)播放[‌1][‌7]。
2. ‌关键帧间隔(GOP)与 B/P 帧依赖断裂
  • -c:v copy 的局限性‌:直接复制流时,B/P 帧的解码依赖关系可能因裸流缺少容器层的元数据而断裂,导致解码器跳过参考帧计算,加速播放[‌2][‌7]。
3. ‌SPS/PPS 信息未嵌入
  • 缺失参数集‌:MP4 中的 SPS/PPS 存储在 extradata 中,直接复制时未通过 h264_mp4toannexb 过滤器插入码流,播放器可能无法正确初始化解码器时间轴[‌1][‌2]。

解决方案

1. ‌强制指定输出帧率

通过 -r 参数显式定义输出帧率,覆盖默认值:

 

bashCopy Code

ffmpeg -i 1.mp4 -c:v copy -r 30 output.h264

  • 作用‌:强制 H.264 裸流按 30fps 播放,避免时间基误判[‌2][‌7]。
2. ‌添加比特流过滤器处理时间戳

使用 setpts 滤镜修正时间戳:

 

bashCopy Code

ffmpeg -i 1.mp4 -c:v copy -bsf:v h264_mp4toannexb -vf "setpts=PTS-STARTPTS" output.h264

  • 关键参数‌:
    • -bsf:v h264_mp4toannexb:插入 SPS/PPS 并修正 NAL 单元格式[‌1][‌2]。
    • setpts=PTS-STARTPTS:重置时间戳为从零开始,消除容器时间基差异[‌7]。
3. ‌验证与调试
  • 检查时间戳信息‌:
     

    bashCopy Code

    ffprobe -show_frames output.h264 | grep "pkt_pts_time"

    确认输出帧的 pkt_pts_time 均匀递增(如 0.033s 间隔对应 30fps)[‌7]。
  • 对比播放效果‌:
     

    bashCopy Code

    ffplay -vf "setpts=PTS-STARTPTS" output.h264 # 强制按原始速度播放


扩展场景:直播推流中的类似问题

若需将 USB 相机的 RGBA 数据编码为 H.264 并推流至 RTMP,需在编码器初始化时手动插入 SPS/PPS,并通过 avcodec_parameters_from_context 传递至输出流上下文,否则 RTMP 播放会出现加速或花屏[‌1][‌2]。


总结

H.264 裸流播放速度异常的本质是 ‌时间戳与帧率元数据丢失‌,需通过过滤器修正时间基或显式指定帧率参数[‌1][‌2][‌7]。

相关文章:

ffmpeg中格式转换需要注意点总结

某些封装格式(例如MP4/FLV/MKV等)的H.264码流的SPS和PPS信息存储在AVCodeccontext结构体的extradata中。分离某些封装格式(例如MP4/FLV/MKV等)中的H.264的时候,需要首先写入SPS和PPS,否则会导致分离出来的数据没有SPS、PPS而无法播。需要使用ffmpeg中名称…...

IntelliJ IDEA 2020~2024 创建SpringBoot项目编辑报错: 程序包org.springframework.boot不存在

目录 前奏解决结尾 前奏 哈!今天在处理我的SpringBoot项目时,突然遇到了一些让人摸不着头脑的错误提示: java: 程序包org.junit不存在 java: 程序包org.junit.runner不存在 java: 程序包org.springframework.boot.test.context不存在 java:…...

基于DeepSeek、ChatGPT支持下的地质灾害风险评估、易发性分析、信息化建库及灾后重建

前言: 地质灾害是指全球地壳自然地质演化过程中,由于地球内动力、外动力或者人为地质动力作用下导致的自然地质和人类的自然灾害突发事件。在降水、地震等自然诱因的作用下,地质灾害在全球范围内频繁发生。我国不仅常见滑坡灾害,还…...

Websoft9分享:在数字化转型中选择开源软件可能遇到的难题

引言:中小企业数字化转型的必由之路 全球94.57%的企业已采用开源软件(数据来源:OpenLogic 2024报告),开源生态估值达8.8万亿美元。中小企业通过开源软件构建EPR系统、企业官网、数据分析平台等,可节省80%软件采购成本。…...

《在 Ubuntu 22.04 上安装 CUDA 11.8 和 Anaconda,并配置环境变量》

安装 CUDA 11.8 和 Anaconda 并配置环境变量 在本教程中,我们将介绍如何在 Ubuntu 22.04 上安装 CUDA 11.8 和 Anaconda,并配置相应的环境变量。我们还将配置使用 阿里云镜像源 来加速软件包更新。以下是具体步骤。 步骤 1:更新软件源 首先…...

【蓝桥杯】算法笔记3

1. 最长上升子序列(LIS) 1.1. 题目 想象你有一排数字,比如:3, 1, 2, 1, 8, 5, 6 你要从中挑出一些数字,这些数字要满足两个条件: 你挑的数字的顺序要和原来序列中的顺序一致(不能打乱顺序) 你挑的数字要一个比一个大(严格递增) 问:最多能挑出多少个这样的数字? …...

Windows修改hosts文件让向日癸软件联网

Windows修改hosts文件让向日癸软件联网 前言一、查看向日葵软件使用的网址及IP1.清除dns记录2.打开向日葵软件并将dns记录导出txt 二、修改Windows服务器的hosts文件1.winx选择Windows PowerShell(管理员)2.在Windows PowerShell中输入如下内容:3.在hosts文件最后添…...

2021 CCF CSP-S2.括号序列

题目 4091. 括号序列 算法标签: 区间 d p dp dp 思路 区间 d p dp dp添加维表示形态 f [ i ] [ j ] [ k ] f[i][j][k] f[i][j][k], 对于每种形态考虑状态如何进行转移, 枚举的时候不能重复, 星号也要定义唯一的解析方式, 算法时间复杂度 O ( n 3 ) O(n ^ 3) O(n3) 代码 #…...

Uni-app 项目 PDF 批注插件库在线版 API 示例教程

本文章介绍 Uni-app 项目中 PDF 批注插件库 ElasticPDF 在线版 API 示例教程,API 包含 ① 导出批注后PDF数据;② 导出纯批注 json 数据;③ 加载旧批注;④ 切换文档;⑤ 切换用户;⑥ 清空批注 等数据处理功能…...

学透Spring Boot — 010. 单元测试和Spring Test

系列文章目录 这是CSDN postnull 博客《学透Spring Boot》系列的一篇,更多文章请移步:Postnull - 学透Spring Boot系列文章 文章目录 系列文章目录前言1. 基本概念UT 单元测试TDD 测试驱动开发UT测试框架Mock框架 3. Spring Test为什么要用Spring Test引…...

TortoiseGit多账号切换配置

前言 之前配置好的都是,TortoiseGit与Gitee之间的提交,突然有需求要在GitHub上提交,于是在参考网上方案和TortoiseGit的帮助手册后,便有了此文。由于GitHub已经配置完成,所以下述以配置Gitee为例。因为之前是单账号使用…...

3D 地图渲染-区域纹理图添加

引入-初始化地图&#xff08;关键代码&#xff09; // 初始化页面引入高德 webapi -- index.html 文件 <script src https://webapi.amap.com/maps?v2.0&key您申请的key值></script>// 添加地图容器 <div idcontainer ></div>// 地图初始化应该…...

【Linux】条件变量封装类及环形队列的实现

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;博客仓库&#xff1a;https://gitee.com/JohnKingW/linux_test/tree/master/lesson &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &…...

离线部署kubesphere(已有k8s和私有harbor的基础上)

前言说明&#xff1a;本文是在已有k8s集群和私有仓库harbor上进行离线安装kubesphere&#xff1b;官网的离线教程写都很详细&#xff0c;但是在部署部份把搭建集群和搭建仓库也写一起了&#xff0c;跟着做踩了点坑&#xff0c;这里就记录下来希望可以帮助到需要的xdm。 1.根据官…...

非阻塞IO,fcntl,多路转接,select,poll,epoll,reactor

IO次数会影响程序的效率&#xff0c;在编程中往往会尽量减少IO次数&#xff0c;用以提高程序的效率&#xff0c;例如缓冲区,就是减少IO次数提高效率的一种方式&#xff1b;而IO影响效率的最大原因其实是因为IO等拷贝&#xff0c;在进行IO时往往需要拷贝的数据就绪&#xff0c;或…...

Redis常用的数据结构及其使用场景

字符串(String) string 是 redis 最基本的类型&#xff0c;你可以理解成与 Memcached 一模一样的类型&#xff0c;一个 key 对应一个 value。 string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据&#xff0c;比如jpg图片或者序列化的对象。 string 类型是 R…...

PhotoShop学习04

1.背景图层 最下面的被锁锁住的图层为背景图层&#xff0c;背景图层充当整个图层的背景&#xff0c;名字标注为背景&#xff0c;无法修改背景图层的排序始终位于图层最底部。 当我想把上方的图层移动到背景图层之后&#xff0c;发现无法移动图层无法移动&#xff0c;把背景图层…...

服务器有2张显卡,在别的虚拟环境部署运行了Xinference,然后又建个虚拟环境再部署一个可以吗?

环境: 云服务器Ubuntu系统 2张 NVIDIA H20 96GB Qwen2.5-VL-72B-Instruct-AWQ Qint4量化 AWQ 是 “Activation - Aware Weight Quantization” 的缩写,即激活感知权重量化。它是一种针对大型模型的先进量化算法,通过在权重量化过程中引入对激活值的感知,最小化量化误差…...

K8s中CPU和Memory的资源管理

资源类型 在 Kubernetes 中&#xff0c;Pod 作为最小的原子调度单位&#xff0c;所有跟调度和资源管理相关的属性都属于 Pod。其中最常用的资源就是 CPU 和 Memory。 CPU 资源 在 Kubernetes 中&#xff0c;一个 CPU 等于 1 个物理 CPU 核或者一个虚拟核&#xff0c;取决于节…...

任务挂起和恢复

任务挂起和恢复API函数 下面用按键和震动传感器验证任务挂起和恢复API函数&#xff1a; PA7接震动传感器&#xff0c;按键引脚为PA0&#xff0c;提前初始化好GPIO引脚 key.c #include "key.h" #include "stm32f10x.h"void KeyInit() {GPIO_InitTypeDef …...

【NLP 55、投机采样加速推理】

目录 一、投机采样 二、投机采样改进&#xff1a;美杜莎模型 流程 改进 三、Deepseek的投机采样 流程 Ⅰ、输入文本预处理 Ⅱ、引导模型预测 Ⅲ、候选集筛选&#xff08;可选&#xff09; Ⅳ、主模型验证 Ⅴ、生成输出与循环 骗你的&#xff0c;其实我在意透了 —— 25.4.4 一、…...

如何在 Windows 上安装 Python

Python是一种高级编程语言&#xff0c;由于其简单性、多功能性和广泛的应用范围而变得越来越流行。如何在 Windows 操作系统中安装 Python 的过程相对简单&#xff0c;只需几个简单的步骤。 本文旨在指导您完成在 Windows 计算机上下载和安装 Python 的过程。 如何在 Windows…...

【Groovy快速上手 ONLY ONE】Groovy与Java的核心差异

最近在使用的平台上写脚本的语言是Groovy&#xff0c;所以也学习一下&#xff0c;作为 Java 开发者&#xff0c;Groovy 对我们来说会非常友好&#xff0c;而且它的语法更简洁且支持动态类型&#xff0c;所以其实了解下Java和Groovy的差异点就可以快速上手了&#xff0c;以下是 …...

计算机系统---CPU

定义与功能 中央处理器&#xff08;Central Processing Unit&#xff0c;CPU&#xff09;&#xff0c;是电子计算机的主要设备之一&#xff0c;是计算机的核心部件。CPU是计算机的运算核心和控制核心&#xff0c;负责执行计算机程序中的指令&#xff0c;进行算术运算、逻辑运算…...

WEB安全--提权思路

一、情形 在我们成功上传webshell到服务器中并拿到权限时&#xff0c;发现我们的权限很低无法执行特定的命令&#xff0c;这时为了能做更多的操作&#xff0c;我们就需要提升权限。 二、方式 2.1、Windows提权 1、普通用户执行systeminfo命令获取服务器的基本信息&#xff0…...

多layout 布局适配

安卓多布局文件适配方案操作流程 以下为通过多套布局文件适配不同屏幕尺寸/密度的详细步骤&#xff0c;结合主流适配策略及最佳实践总结&#xff1a; 一、‌创建多套布局资源目录‌ ‌按屏幕尺寸划分‌ 在 res 目录下创建以下文件夹&#xff08;根据设备特性自动匹配&#xff…...

selectdb修改表副本

如果想修改doris&#xff08;也就是selectdb数据库&#xff09;表的副本数需要首先确定是否分区表&#xff0c;当前没有数据字典得知哪个表是分区的&#xff0c;只能先show partitions看结果 首先&#xff0c;副本数不应该大于be节点数 其次&#xff0c;修改期间最好不要跑业务…...

Metabase:一个免费开源的BI平台

今天给大家介绍一个开源数据可视化分析工具&#xff1a;Metabase。它可以帮助用户快速连接数据库、执行查询并创建交互式仪表盘&#xff0c;即使非技术人员也能快速上手。 Metabase 支持多种数据源&#xff0c;包括 MySQL、PostgreSQL、Oracle、SQL Server、SQLite、MongoDB、P…...

第15届蓝桥杯省赛python组A,B,C集合

过几天就省赛了&#xff0c;一直以来用的是C&#xff0c;Python蓝桥杯也是刚刚开始准备&#xff08;虽然深度学习用的都是python&#xff0c;但是两者基本没有任何关系&#xff09;&#xff0c;这两天在做去年题时犯了很多低级错误&#xff0c;因此记录一下以便自己复查 PS&am…...

AWS 云运维管理指南

一、总体目标 高可用性:通过跨可用区 (AZ) 和跨区域 (Region) 的架构设计,确保系统运行可靠。性能优化:优化AWS资源使用,提升应用性能。安全合规:利用AWS内置安全服务,满足行业合规要求(如GDPR、ISO 27001、等保2.0)。成本管控:通过成本优化工具,减少浪费,实现FinOp…...