video-analysis

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Video Analysis

视频分析

Analyze MP4/video files using CLI tools. All commands output JSON for jq filtering.
使用CLI工具分析MP4/视频文件。所有命令均输出JSON格式,以便用jq进行过滤。

FFprobe Basics

FFprobe基础

Format + Streams (most common)

格式 + 流(最常用)

bash
ffprobe -v quiet -print_format json -show_format -show_streams FILE.mp4
Key fields:
.format.duration
,
.streams[].codec_name
,
.streams[].codec_type
bash
ffprobe -v quiet -print_format json -show_format -show_streams FILE.mp4
关键字段:
.format.duration
.streams[].codec_name
.streams[].codec_type

Stream selection

流选择

bash
-select_streams v:0   # first video stream
-select_streams a:0   # first audio stream
-select_streams v     # all video streams
bash
-select_streams v:0   # 第一个视频流
-select_streams a:0   # 第一个音频流
-select_streams v     # 所有视频流

Packets (sample-level data)

数据包(样本级数据)

bash
ffprobe -v quiet -print_format json -show_packets FILE.mp4
Key fields:
.packets[].pts_time
,
.packets[].flags
,
.packets[].size
Flag meanings:
K
= keyframe,
D
= discard,
_
= none
bash
ffprobe -v quiet -print_format json -show_packets FILE.mp4
关键字段:
.packets[].pts_time
.packets[].flags
.packets[].size
标志含义:
K
= 关键帧,
D
= 丢弃,
_
= 无

Keyframe packets only

仅查看关键帧数据包

bash
ffprobe -v quiet -print_format json -show_packets -select_streams v:0 FILE.mp4 | \
  jq '[.packets[] | select(.flags | test("K"))]'
bash
ffprobe -v quiet -print_format json -show_packets -select_streams v:0 FILE.mp4 | \
  jq '[.packets[] | select(.flags | test("K"))]'

Count keyframes

统计关键帧数量

bash
ffprobe -v quiet -print_format json -show_packets -select_streams v:0 FILE.mp4 | \
  jq '[.packets[] | select(.flags | test("K"))] | length'
bash
ffprobe -v quiet -print_format json -show_packets -select_streams v:0 FILE.mp4 | \
  jq '[.packets[] | select(.flags | test("K"))] | length'

Frames (decoded frame info)

帧(解码后帧信息)

bash
ffprobe -v quiet -print_format json -show_frames FILE.mp4
Key fields:
.frames[].pict_type
(I/P/B),
.frames[].key_frame
,
.frames[].pts_time
bash
ffprobe -v quiet -print_format json -show_frames FILE.mp4
关键字段:
.frames[].pict_type
(I/P/B帧)、
.frames[].key_frame
.frames[].pts_time

Limit frame count (faster)

限制帧数量(更快)

bash
ffprobe -v quiet -print_format json -show_frames -read_intervals "%+#100" FILE.mp4
Reads first 100 frames only.
bash
ffprobe -v quiet -print_format json -show_frames -read_intervals "%+#100" FILE.mp4
仅读取前100帧。

Common Queries

常见查询

Duration

时长

bash
ffprobe -v quiet -show_entries format=duration -of csv=p=0 FILE.mp4
bash
ffprobe -v quiet -show_entries format=duration -of csv=p=0 FILE.mp4

Frame count

帧数量

bash
ffprobe -v quiet -select_streams v:0 -show_entries stream=nb_frames -of csv=p=0 FILE.mp4
bash
ffprobe -v quiet -select_streams v:0 -show_entries stream=nb_frames -of csv=p=0 FILE.mp4

Codec info

编解码器信息

bash
ffprobe -v quiet -print_format json -show_streams FILE.mp4 | \
  jq '.streams[] | {codec: .codec_name, type: .codec_type, profile: .profile}'
bash
ffprobe -v quiet -print_format json -show_streams FILE.mp4 | \
  jq '.streams[] | {codec: .codec_name, type: .codec_type, profile: .profile}'

Video dimensions

视频尺寸

bash
ffprobe -v quiet -select_streams v:0 -show_entries stream=width,height -of csv=p=0 FILE.mp4
bash
ffprobe -v quiet -select_streams v:0 -show_entries stream=width,height -of csv=p=0 FILE.mp4

Sample rate / channels (audio)

采样率/声道数(音频)

bash
ffprobe -v quiet -select_streams a:0 -show_entries stream=sample_rate,channels -of csv=p=0 FILE.mp4
bash
ffprobe -v quiet -select_streams a:0 -show_entries stream=sample_rate,channels -of csv=p=0 FILE.mp4

MP4 Box Structure (mp4dump)

MP4盒子结构(mp4dump)

bash
mp4dump --format json FILE.mp4
bash
mp4dump --format json FILE.mp4

Key boxes

关键盒子

  • ftyp
    : file type/brand
  • moov
    : movie metadata (contains all track info)
  • mvhd
    : movie header (duration, timescale)
  • trak
    : track container
  • mdhd
    : media header (per-track timescale/duration)
  • stbl
    : sample table (stts, stss, stsz, stco)
  • stss
    : sync sample table (keyframe positions)
  • moof
    : movie fragment (fragmented MP4)
  • mdat
    : media data
  • ftyp
    : 文件类型/标识
  • moov
    : 影片元数据(包含所有轨道信息)
  • mvhd
    : 影片头(时长、时间刻度)
  • trak
    : 轨道容器
  • mdhd
    : 媒体头(每个轨道的时间刻度/时长)
  • stbl
    : 样本表(stts、stss、stsz、stco)
  • stss
    : 同步样本表(关键帧位置)
  • moof
    : 影片片段(碎片化MP4)
  • mdat
    : 媒体数据

Find specific box

查找特定盒子

bash
mp4dump --format json FILE.mp4 | jq '.. | objects | select(.name == "mvhd")'
bash
mp4dump --format json FILE.mp4 | jq '.. | objects | select(.name == "mvhd")'

Fragmented MP4 check

碎片化MP4检查

bash
mp4dump --format json FILE.mp4 | jq '[.. | objects | select(.name == "moof")] | length'
Non-zero = fragmented.
bash
mp4dump --format json FILE.mp4 | jq '[.. | objects | select(.name == "moof")] | length'
结果非零即为碎片化MP4。

JQ Patterns

JQ模式

Filter by field value

按字段值过滤

bash
jq '.streams[] | select(.codec_type == "video")'
bash
jq '.streams[] | select(.codec_type == "video")'

Extract specific fields

提取特定字段

bash
jq '.streams[] | {codec: .codec_name, duration: .duration}'
bash
jq '.streams[] | {codec: .codec_name, duration: .duration}'

Count items

统计条目数量

bash
jq '.packets | length'
bash
jq '.packets | length'

First N items

获取前N个条目

bash
jq '.packets[:10]'
bash
jq '.packets[:10]'

Sum values

求和

bash
jq '[.packets[].size | tonumber] | add'
bash
jq '[.packets[].size | tonumber] | add'

CSV Output (for scripting)

CSV输出(用于脚本)

bash
ffprobe -v quiet -select_streams v:0 -show_entries packet=pts_time,flags,size -of csv=p=0 FILE.mp4
Output:
0.000000,1263,K__
(one line per packet)
bash
ffprobe -v quiet -select_streams v:0 -show_entries packet=pts_time,flags,size -of csv=p=0 FILE.mp4
输出示例:
0.000000,1263,K__
(每个数据包一行)

Test Assets

测试资源

Sample files in
elements/test-assets/
:
  • 10s-bars.mp4
    - 10s color bars with audio
  • frame-count.mp4
    - frame counting test
  • bars-n-tone.mp4
    - multi-track test
测试文件位于
elements/test-assets/
目录下:
  • 10s-bars.mp4
    - 带音频的10秒彩条视频
  • frame-count.mp4
    - 帧计数测试视频
  • bars-n-tone.mp4
    - 多轨道测试视频