ffprobe + Excel绘制视频,音频码率变化曲线,趋势线,帧类型饼图

A@NAZOrip
A@NAZOrip 2022年11月10日
  • 在其它设备中阅读本文章

本教程是ffprobe教程的延伸。建议先阅读本体哦~

本教程提供了绘制码率变化曲线,码率变化趋势,帧类型饼图的解决方案,限制条件是禁止使用Python环境与模块,VBS命令,宏,批处理,ps1,shell,MSSQL,网页工具等等需要配置环境的数据处理方法来降低门槛。如果有条件则完全可以用它们来得到同样的结果。

2025.3:在不同的编码格式,以及不同版本的 Excel 下,操作和本文中说明,以及实际情况与本文中提供的截图会有出入,但不影响操作。


下载ffprobe

  1. 解压出ffprobe.exe,记住解压路径

读取视频并输出 xml

PowerShell 批量分析 XML 并转换文本编码

$files = @(
    ".\视频1.mp4",
    ".\视频2.mp4",
    ".\视频3.hevc"
)
# 强制指定 UTF-8 with BOM,以兼容 Excel
foreach ($file in $files) {
    $video = [System.IO.Path]::GetFileNameWithoutExtension($file)
    $outputPath = "D:\Desktop\ffprobe-xmls\$video.xml"
    Write-Host "正在处理 $file..."
    & ffprobe -i $file -select_streams v:0 -v error -hide_banner -show_frames -show_entries frame=pkt_pts,best_effort_timestamp,pkt_size,pict_type,key_frame,interlaced_frame -of xml |
    Out-File -FilePath $outputPath -Encoding UTF8
}
Write-Host "分析完成"

导入Excel

  1. 打开Excel,不用建立新工作簿,直接将xml拖入其中
  2. 选择"作为只读xml表",点确定
  3. 不用管"指定的xml源没有引用架构..."提示,点确定,表格结果如图
  4. 由于ffprobe用字节byte作计量单位,而bit才是常用剂量码率的单位,所以需要新建一列做转换
  5. 显示 “H.26[45] User Data Unregistered SEI message” 的列可以直接删除,这些信息一般属于额外的解码配置
  6. 整理标题栏,如果标题栏在行 2,则删除行 1、同时如果标题栏有很多无效信息,则进行修剪,这对接下来的表格创建有很大帮助
    • 如“/frames/frame/@best_effort_timestamp”改为“best_effort_timestamp”

byte 转 bit

  1. 单击标题栏外的新列,如下图中的 G1 格
  2. 在顶部编辑栏写pkt_size_bit,点击 或按 Enter 确认
    • excel_image1.png
    • Excel 中,不按确认就默认用户还未输入完,很容易造成误操作
    • 此时,自动更正会套用标题,格式没有变化则去文件→选项→校对→自动更正→键入时自动套用格式→工作时应用: □ 在表中包含新行和列,再重试
    • excel_image2.png
  3. 单击除pkt_size_bit 外的任意标题(key_frame,pkt_pts等),在右下角可以看到 计数: xxxxx,代表当前表格高度——视频的总帧数
    excel_image3.png
  4. 找到 pkt_size 列的格,图中为 D2
    • 单击 pkt_size_bit 列往下 1 格(下图中的 G2,若标题栏在行 2 则是 G3 格)
    • 在顶部编辑栏写=PRODUCT(D2*8),点击 或按 Enter 确认
    • excel_image4.png
    • 当然,Kbit 更加易读,所以可以改写为 =PRODUCT(D2*8/1000)=PRODUCT(D2*8/1024),后者为二进制大小
  5. 如果整列数据没有变化,则选择刚刚填充好的格(图中的 G2),按 Ctrl+Shift+↓ 选择所有下方格,然后在顶部菜单栏选择开始→编辑→填充→向下,完成填充
    • 或者,去文件→选项→校对→自动更正→键入时自动套用格式→工作时应用: □ 在表中包含新行和列,然后重试
    • 如果仍没有变化则去文件→选项→高级→编辑选项打开“为单元格值启用自动完成”以及其子项,然后重试
  6. 如果 6 中选择了插入,则数据会一直插入到 Excel 表格的列数极限,此时要找到表格的实际末尾,然后从多余列开始选中,按 Ctrl+Shift+↓ 选择所有下方格,再按 Delete 删除

变化线

  1. 单击 best_effort_timestamp 上方的列号以选中整列
    • 新版 Excel:单击 best_effort_timestamp 标题,然后按 Ctrl+Shift+↓ 选中表格,否则会一直选中到 Excel 的最末行
  2. 按住 Ctrl 并单击刚刚创建 pkt_size_bit 上的标号以同时选中该列
    • 新版本 Excel:在保持 best_effort_timestamp 选中的情况下,拖动右侧滚动条到表格顶部,按 Ctrl 单击 pkt_size_bit,再按 Ctrl+Shift+↓ 选中该列(不松开 Ctrl 也可以)
    • excel_image5.png
  3. 在Excel顶栏上选插入→图表栏→折线图→二维面积图就得到精确的码率变化图表了
    excel_image6.png
    • 新版本 Excel 中需要去勾选 best_effort_timestamp 列的显示:

      • excel_image6-2.png
    • 由于非常精确,所以要放大,拉长才能看清很细的线
  4. 单击图中面积阴影部分以选中,此时图表会显示全部顶点;
    • 光标放在顶点上,Excel显示"绘图区"时微移光标一下(仍然保持在顶点上),就会得到对应点的编号
    • 一般情况下,这些尖峰顶点是I帧,但也可能是大部分为I块的P帧

注:若视频很长,则移动图表的最好方法是 Ctrl+X 剪切,然后拖拽滚动条到顶部,选中适合的格子再使用 Ctrl+V 粘贴

注:对于图表坐标轴中的负值,可以从 选中图表→菜单栏图表工具→图表→格式→当前选中内容→将“绘图区”选项改选为“垂直(值)轴”→在右侧展开的“设置坐标轴格式”栏→数轴→坐标轴选项 中手动设定最小值修正。
image8-2.png

趋势线

  1. 单击面积阴影部分以选中,右键-->添加趋势线
  2. 默认会出现线性趋势线,根据需要的分析方法选择需要的趋势线:
    • excel_image7.png

      • 线性:单纯分析码率增长速度
      • 指数:对码率增长敏感时,看指数线曲度是否足够直
      • 对数:log,对增长不敏感,但初始变化敏感的分析
      • 多项式,阶数6:分析哪部分视频占平均码率更大(阶数最大竟然只有6,切)
        excel_image7x.png
      • 移动平均,周期10:额外添加一条更平均的码率变化曲线

帧类型饼图

    1. 分别在H1(列H行1,或列8行1),I1,J1,K1,L1填写以下标题
      • count_Icount_Pcount_Bcount_IDRcount_non_IDR
    2. 和开始添加pkt_size_bit一样,Excel应该会自动套用格式
      excel_image8.png
    3. 选中count_I标题下格,编辑栏中填写=COUNTIF(E2:E99999,"I"),点击左边的"√"或按Enter
      • 其中的E代表pict_type列,99999代表取决于帧数量的表格高度,超过99999则填写实际高度
      • 忽略这些自动填充导致第二行往下出现的新值
        excel_image9.png
    1. 选中count_P标题下格,编辑栏中填写=COUNTIF(E2:E99999,"P")
    2. 选中count_B标题下格,编辑栏中填写=COUNTIF(E2:E99999,"B")
    3. 选中count_IDR标题下格,编辑栏中填写=COUNTIFS(E2:E99999,"I",A2:A99999,"1")
      • 其中的A代表key_frame列,如果不是则需要修改到匹配列的字母
      • COUNTIFS支持多个判断条件
    4. 选中count_non_IDR标题下格,编辑栏中填写=COUNTIFS(E2:E99999,"I",A2:A99999,"0")
      excel_image10.png
      • 为保证COUNTIFS不算错,需要与count_non_IDR求和,应当等于count_I
        excel_image11.png
    5. 拖拽选中I1到L2(count_P,count_B,count_IDR,count_non_IDR以及下方对应格子的值,共2x4个项)
    6. 在Excel顶栏上选插入-->饼图-->更多饼图-->子母饼图-->第二个推荐项目,帧类型的饼图就做好了
      • 考虑到会出现千分之一比值的帧类型,所以为了避免看不到,只能选子母饼图
      • excel_image12.png
      • 选一个漂亮的样式吧
      • excel_image13.png

    这玩意做了才知道有多难,那么就这样<(。_。)>

    ::转载要求: 在本文下方写上"转载+冒号+转载地址",或者下方发个评论... 但是真的会有人转载这玩意儿吗?

    更新信息

    1. 增加批量转换文本编码到 UTF-8 BOM 的命令
    2. 增加批量分析视频的 PowerShell 命令

    打赏信息

    在线丢人,求个打赏,支持一下T_T
    pp_tip_qrcode.png

      [...]附录 δ:ffprobe + Excel 绘制码率曲线,帧类型饼图[...]

      [...]ffmpeg强大的 CLI 开源视音频处理工具。几乎所有的视音频处理都绕不开mpv开源,支持便携的现代视频播放器。见安装与配置教程Voukoder开源 Premiere Vegas After Effects 压制导出插件,分为 Voukoder 和 V-Connector 两部分OBS强大的开源直播框架和软件,设置略比传统录屏软件复杂,但效果也更好MediaInfo开源的 GUI 媒体元数据/视[...]

      Chrysoberyl
      Chrysoberyl  2023-07-29, 01:40

      这个信息建议编码时从编码器获取,还可以拿到量化值信息,ffprobe是无法获取量化信息的。x264可以使用--log-level debug,x265使用--csv-log-level 1加上--csv指定输出文件即可。x264的输出是在stderr的,所以如果要输出到文件还要2>&1重定向一下。处理数据的话我的建议是用python的pandas库读取csv文件,之后用matplotlib画图。相比于帧信息,我更关注码率分配,因此一般取50-100帧的窗口,每一个窗口内取所有帧大小的平均值再计算码率,可以画出近实时的码率变化,对于较长的视频来说完全够用。例子:https://imgur.com/eMRw4uj 希望一点个人经验对博主有所启发,欢迎继续交流!

        A@NAZOrip
        A@NAZOrip  2025-04-08, 04:09

        这个方法更好,不过需要的前期准备也更多(比如要是工作/学校的电脑只有一个 Excel,而且没有安装权限和时间就不太方便),看情况用