问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

B站UP主教你用FFmpeg准确检测视频帧率

创作时间:
作者:
@小白创作中心

B站UP主教你用FFmpeg准确检测视频帧率

引用
CSDN
8
来源
1.
https://m.blog.csdn.net/gitblog_00325/article/details/144260794
2.
https://blog.csdn.net/saminigod/article/details/42296609
3.
https://blog.csdn.net/weixin_34035088/article/details/118817079
4.
https://blog.csdn.net/ternence_hsu/article/details/106560505
5.
https://www.intel.com/content/www/cn/zh/support/articles/000095403/graphics.html
6.
https://www.cnblogs.com/tanlon/articles/3879081.html
7.
https://www.cnblogs.com/dongxixi/p/14229083.html
8.
https://www.cnblogs.com/rongmiao/p/18195001

在视频制作和处理领域,准确获取视频帧率是至关重要的基础工作。然而,许多视频制作者发现,直接使用FFmpeg获取的帧率往往存在误差。本文将为你揭示其中的原因,并提供准确计算帧率的解决方案。

01

为什么直接获取帧率不准确?

FFmpeg作为一个强大的多媒体处理工具,提供了多种获取视频信息的方式。然而,在获取帧率时,直接使用-r参数或从视频流信息中读取的帧率可能并不准确。这主要是由于以下几个原因:

  1. 元数据依赖性:FFmpeg直接读取视频文件的元数据来获取帧率信息。然而,某些视频格式(如MP4)的元数据可能记录错误,导致获取的帧率不准确。

  2. 编辑列表影响:对于MP4、M4V等格式的视频,存在编辑列表(edit list)的概念。编辑列表可能会影响帧的显示顺序和时间戳,从而导致直接获取的帧率出现偏差。

  3. 可变帧率视频:对于可变帧率(VFR)的视频,直接读取的帧率往往是一个平均值,无法反映视频的真实帧率变化。

02

如何准确获取帧率?

要获得准确的帧率,最可靠的方法是通过计算视频的总帧数除以总时长。下面介绍两种具体实现方式:

快速方法:查询容器信息

使用ffprobe(FFmpeg的分析工具)可以快速获取视频的总帧数。这种方法适用于大多数格式,但对MP4等格式可能不够准确。

ffprobe -v error -select_streams v:0 -show_entries stream=nb_frames -of default=nokey=1:noprint_wrappers=1 input.mp4

准确方法:逐帧计数

为了获得最准确的帧数,可以使用ffprobe的-count_frames选项进行逐帧计数。虽然这种方法耗时较长,但能提供最精确的结果。

ffprobe -v error -count_frames -select_streams v:0 -show_entries stream=nb_read_frames -of default=nokey=1:noprint_wrappers=1 input.mkv

对于MP4格式,建议使用-ignore_editlist 1选项来忽略编辑列表的影响:

ffprobe -v error -count_frames -select_streams v:0 -show_entries stream=nb_read_frames -of default=nokey=1:noprint_wrappers=1 -ignore_editlist 1 input.mp4

计算帧率的Python示例

获取到总帧数和视频时长后,可以通过简单的计算得到准确的帧率。以下是一个Python示例:

import subprocess

def get_video_duration(video_path):
    result = subprocess.run(["ffprobe", "-v", "error", "-show_entries", "format=duration", "-of", "default=noprint_wrappers=1:nokey=1", video_path], stdout=subprocess.PIPE)
    return float(result.stdout)

def get_total_frames(video_path):
    result = subprocess.run(["ffprobe", "-v", "error", "-count_frames", "-select_streams", "v:0", "-show_entries", "stream=nb_read_frames", "-of", "default=nokey=1:noprint_wrappers=1", "-ignore_editlist", "1", video_path], stdout=subprocess.PIPE)
    return int(result.stdout)

def calculate_fps(video_path):
    duration = get_video_duration(video_path)
    frames = get_total_frames(video_path)
    return frames / duration

video_path = "input.mp4"
fps = calculate_fps(video_path)
print(f"准确帧率: {fps:.2f} fps")
03

实际应用场景

准确的帧率信息在多个场景中都至关重要:

  1. 视频编辑:在进行视频剪辑时,准确的帧率有助于确保画面的流畅性和同步性。

  2. 转码和压缩:在调整视频质量或进行格式转换时,正确的帧率是保持视频质量的关键参数。

  3. 视频分析:在进行视频内容分析或AI处理时,准确的帧率信息对于时间戳的计算至关重要。

  4. 直播流处理:在处理直播流时,准确的帧率有助于优化编码效率和网络传输。

04

实用建议

  1. 优先使用准确方法:虽然快速方法更省时,但在需要精确结果的场景下,建议使用逐帧计数的方法。

  2. 注意格式差异:不同视频格式可能需要不同的处理方式,特别是MP4格式需要考虑编辑列表的影响。

  3. 结合其他工具:在某些情况下,可以使用mediainfo、MP4Box等工具进行交叉验证。

通过以上方法,你可以轻松获得准确的视频帧率,从而在视频处理和制作中避免因帧率误差带来的困扰。记住,虽然直接使用FFmpeg获取帧率很方便,但在追求高质量输出时,准确计算帧率是必不可少的步骤。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号