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 // 数据的大小

相关推荐