• ffmpeg 分析一个视频的基本结构组成_流_包_帧


    分析视频流

    stream[0]

    • duration = 2019840 // 视频的时长时间戳,计算秒 2019840/12800
    • index = 0 // 流索引,这是一个视频流
    • nb_frames // 视频的总帧数
    • avg_frame_rate // 视频的帧数, num/den就是帧数
    • timebase = {1, 12800} // 视频流的时间基
    • first_dts = -1024 // 第一帧的dts
    • cur_dts = 当前帧的dts
    • codecpar
      • codec_type = AVMEDIA_TYPE_VIDEO // 编码器的类型
      • codec_id = AV_CODEC_ID_H264 // 编码格式
      • bit_rate = 252212 // 比特率
      • width = 1920 // 宽
      • height = 1080 // 高
      • format = 0 // 颜色格式,0是yuv420p
      • profile = 77
      • level = 40

    stream[0]的Packet(包数据)

    • pts = 这一个packet的pts,也就是当前的时间戳
    • dts = 值一个packet的dts,这是解码时间戳
    • duration = 1024 # 这一个包所占用的时间戳
    • data = 这一个包的数据
    • flags = 1 // 表示域,flags=1的话就是关键帧的意思
    • stream_index = 1 # 代表这个包属于音频还是视频的index
    • pos = 129410 # 代表示流媒体的偏移量
    • size = 1024 # 代表数据的大小

    stream[0]的Stream(解码后帧的数据)

    • data = 解码后的流数据

      • 对于packed格式的数据(例如RGB24),会存到data[0]里面。
      • 对于planar格式的数据(例如YUV420P),则会分开成data[0],data[1],data[2]...(YUV420P中data[0]存Y,data[1]存U,data[2]存V)
    • linsize = 每一行的数据大小

    • key_frames = 1 // 是否是关键帧 , 如果是音频一定是关键帧

    • pts = 0 // 时间戳,解码之后的,编码之前需要自己进行定义

    • width = 1920 // 图像的宽度

    • height = 1080 // 图像的高度

    • format = 0 // 图像的格式 yuv420p

    • pict_type = AV_PICTURE_I // 图像的帧类型,这个是I帧的意思

      • AV_PICTURE_TYPE_I I帧
      • AV_PICTURE_TYPE_B B帧
      • AV_PICTURE_TYPE_P P帧
      • ...
    • pkt_size = 78000 // 包的大小

    分析音频流数据

    stream[1]

    • index =1 // 流索引,这是一个音频流
    • duration = 7576560 // 音频的总时间戳
    • time_base = {1, 48000} // 音频流的时间基
    • nb_frames = 7400 // 音频一共7400帧, 一秒 47帧左右, 一秒采样48000次,那么每一帧采样的大小决定了音频的实际帧数
    • first_dts = -1024 // 第一帧的dts
    • cur_dts = 当前帧的dts
    • codecpar
      • codec_type = AVMEDIA_TYPE_AUDIO // 音频类型
      • codec_id = AV_CODEC_ID_AAC // 编码格式:AAC
      • format = 8 // 音频的采样格式AV_SAMPLE_FMT_FLTP
      • bit_rate = 126772 // 比特率 126772
      • channel_layout = 3 // 音频的通道的存储顺序
      • channels = 2 // 音频的通道数
      • sample_rate = 48000 // 音频的采样率
      • frame_size = 1024 // 每一帧的PTS量

    stream[1]的Packet(包数据)

    • pts = 这一个packet的pts,也就是当前的时间戳
    • dts = 值一个packet的dts,这是解码时间戳
    • duration = 1024 # 这一个包所占用的时间
    • data = 这一个包的数据
    • flags = 1 // 表示域,flags=1的话就是关键帧的意思
    • stream_index = 1 # 代表这个包属于音频还是视频的index
    • pos = 129410 # 代表示流媒体的偏移量
    • size = 1024 # 代表数据的大小

    stream[1]的Stream(解码后帧的数据)

    • data = 解码后的流数据,视频是yuv,rgb,音频是PCM数据

    • linesize = data中一行数据的大小

    • nb_samples = 音频中一个AVFrame这里标记包含了多少个采样数值

    • format = 8 //解码后的原始数值

    • key_frame = 1 // 是否是关键帧,音频都是1

    • pts = 显示时间戳

    • sample_rate = 48000 // 采样率

    • channel_layout = 3 //

    • data = 解码后的流数据

      • 对于packed格式的数据(例如RGB24),会存到data[0]里面。
      • 对于planar格式的数据(例如YUV420P),则会分开成data[0],data[1],data[2]...(YUV420P中data[0]存Y,data[1]存U,data[2]存V)
    • linsize = 每一行的数据大小

    • nb_samples = 1024 // 音频数据一帧使用1024个采样率

    • format = 8 // AV_SAMPLE_FMT_FLTP

    • key_frames = 1 // 是否是关键帧 , 如果是音频一定是关键帧

    • pts = 0 // 时间戳,解码之后的,编码之前需要自己进行定义i

    • pkt_size = 78698 // 数据的大小

  • 相关阅读:
    JMeter笔记:关于时间函数_time的简单使用(时间戳、时间)
    搜索&分页功能主要测试点
    JMeter笔记十五:逻辑控制器之临界部分控制器(Critical Section Controller)
    JMeter笔记十四:Beanshell取样器
    Python3+RobotFramework自动化测试十:接口测试
    Github Pages中的Octopress框架搭建个人博客(下)
    pycharm破解
    计算机网络 UDP协议
    计算机网络 路由器协议
    计算机网络 TCP协议
  • 原文地址:https://www.cnblogs.com/fandx/p/12208107.html
Copyright © 2020-2023  润新知