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 // 數據的大小


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM