1. 程式人生 > >網頁視訊之MP4檔案解析

網頁視訊之MP4檔案解析

為了研究如何把H264打包成fMp4檔案,今天先開始研究如何從fMp4中解析出H264資料。

fMP4包括ftype+moov+(moof+mdat)*N這種格式組成。

Box的定義:


ftyp格式:


上碼流:

size:00 00 00 1C  ===>28

type: 66 74 79 70 =====>ftyp

major_brand:6D 70 34 32 ===>mp42

minor_version :00 00 00 01 ===>1

compatible_brands: 6D 70 34 32===》mp42    ||  next  61 76 63 31 ===>avc1 || next 69 73 6F 35 ==>iso5

****************************************以下為moov的box介紹***********************************

moov格式:

moov格式十分複雜,包含了大量的媒體資訊,

先研究第一級目錄:


moov開始就8個位元組


size:00 00 07 57  ===>1879

type: 6D 6F 6F 76 =====>moov

緊接著mvhd定義如下:



size:00 00 00 6C  ===>108

type: 6D 76 68 64 =====>mvhd

version:00 00 00 00====》0

creation_time: 00 00 00 00

modification_time:00 00 00 00

timescale:00 00 03 E8  ===》1000

duration:00 00 EA BF ===》60095

rate:00 01 00 00

volume:01 00

reserved16:00 00

reserved32:00 00 00 00      00 00 00 00

matrix:00 01 00 00    00 00 00 00    00 00 00 00    00 00 00 00   00 01 00 00  00 00 00 00

00 00 00 00   00 00 00 00  40 00 00 00

pre_defined: 00 00 00 00    00 00 00 00   00 00 00 00   00 00 00 00   00 00 00 00   00 00 00 00

next_track_ID: FF FF FF FF

接著trak格式定義如下:

trak如下:


size:00 00 01 A4  ===>420

type: 74  72 61 6B =====>trak

tkhd定義如下:


上碼流


size:00 00 00 5C  ===>92

type: 74  6B 68 64 =====>tkhd

version:00  ==》0

flags:00 00 07 =》7

creation_time:00 00 00 00 =>0

modification_time: 00 00 00 00 =>0

track_ID: 00 00 00 01 ===>1

reserved0 : 00 00 00 00

duration : 00 00 EA BF ===>60095

reserved1 : 00 00 00 00      00 00 00 00

layer: 00 00

alternate_group: 00 00

volume : 00  01

reserved2 : 00 00

matrix: 00 01 00 00      00 00 00 00   00 00 00 00   00 00 00 00    00 01 00 00   00 00 00 00   00 00 00 00   00 00 00 00

04 00 00 00

width: 00 00 00 00

height: 00 00 00 00

mdia如下


size:00 00 01 40  ===>320

type: 6D 64 69 61 =====>mdia

mdhd定義如下:

上碼流:

size:00 00 00 20  ===>32

type: 6D 64 68 64 =====>mdhd

version: 00 00 00 00 ====>0

creation_time:====>00 00 00 00

modification_time:====>00 00 00 00

timescale:====>00 00 56 22  ===>22050

duration: 00 00 00 00 ====>0

pad: 0

language: 00101    01110  00111  ===>eng

pre_defined ===>0

hdlr 定義如下:

上碼流:


size:00 00 00 35 ===>53

type: 68 64 6C 72 =====>hdlr

version: 00 00 00 00

pre_defined:00 00 00 00

handler_type:73 6F 75 6E ====>soun

reserved:0

name: Bento4 Sound Handler

minf 定義如下:


size:00 00 00 E3 ===>227

type: 6D 69 6E 66 =====>minf

smhd 定義如下:


上碼流:

size:00 00 00 10 ===>16

type: 73 6D 68 64 =====>smhd

version: 0

balance:0

reserved:0

dinf 定義如下:

size:00 00 00 24 ===>36

type: 64 69 6E 66 =====>dinf

dref定義如下:


上碼流:


size:00 00 00 1C ===>28

type: 64 72 65 66 =====>dref

version:00 00 00 00

entry_count:00 00 00 01

url 定義如下:

上碼流:

size:00 00 00 0C ===>12

version: 00 00 00 01

location:same file

stbl 定義如下:


size:00 00 00 A7 ===>12

version: 73 74 62 6C====>stbl

stsd 定義如下:

上碼流:


size:00 00 00 5B ===>91

type: 73 74 73 64====>stsd

version:00 00 00 00

entry_count: 00 00 00 01

mp4a定義如下:


上碼流:


size:00 00 00 4B ===>78

type: 6D 70 34 61====>mp4a

reserved[6] :00 00 00 00  00 00

data_reference_index: 00 01

reserved1: 00 00 00 00   00 00 00 00

channelcount: 00 02

samplesize: 16

pre_defined: 00 00

reserved2: 00 00

samplerate: 22050

esds定義如下:

沒有找到定義,不知道哪位高手知道在哪裡。直接上碼流:


工具解析截圖如下:

參考這裡https://stackoverflow.com/questions/3987850/mp4-atom-how-to-discriminate-the-audio-codec-is-it-aac-or-mp3

the value of the 11th Byte

  • 0x40 - MPEG-4 Audio
  • 0x6B - MPEG-1 Audio (MPEG-1 Layers 1, 2, and 3)
  • 0x69 - MPEG-2 Backward Compatible Audio (MPEG-2 Layers 1, 2, and 3)
  • 0x67 - MPEG-2 AAC LC

找了一圈,找到一個解釋,但是還是沒搞清楚出處。(轉自https://blog.csdn.net/evsqiezi/article/details/73920290)

ESDs中可以分為三層,每層為包含關係,分別為MP4ESDescr(0x03開始,一般7個位元組),MP4DecConfigDescr(0x04開始,一般13個位元組),MP4DecSpecificDescr

esds box分析例子:

這是一段ESDS資料
00001e7: 0000 0027 6573 6473 0000 0000 0319 0000  ...'esds........
00001f7: 0004 1140 1500 01f8 0001 2728 0000 f3e8  [email protected]'(....
0000207: 0502 1388 0601 02                        .......

分析如下:
0000 0027:   :esds box長度, 長度是39
6373 6473:   :esds box type: esds
00           :Version為0
  00 0000:   :Flags為0
03           :ES_DescrTag 見14496-1 Table 1
  19         :Length Field:25
     0000:   :ES_ID: 是0
00           :00(hex) =
             :0000 0000(bits)
             :0              :steamDependenceFlag,如果為1,則有16bits的dependsOn_ES_IS
             : 0             :URL_Flag,如果為1,後邊則有8bits URLlength, 和相應的URLstring(URLlength)
             :  0            :OCRstreamFlag, 如果為1,有16bits OCR_ES_id;
             :   0 0000      :streamPriority
  04         :DecoderConfigDescriptor TAG
     11      :Length Field:17
       40:   :objectTypeIndication 14496-1 Table8, 0x40是Audio ISO/IEC 14496-3
15           :15(hex) =
             :0001 0101
             :0001 01        :streamType  5是Audio Stream, 14496-1 Table9
             :       0       :upStream
             :        1      :reserved
  00 01f8:   :bufferSizeDB   504
0001 2728:   :maxBitrate  75560          //可以獲取最大位元速率
0000 f3e8:   :avgBitrate  62440            //可以獲取平均位元速率
05           :DecSpecificInfotag
  02         :Length Field:2
     1388    :14496-3 1.6
             :1388(hex)=
             :0001 0011 1000 1000(bit)
             :0001 0                     :audioObjectType 2 GASpecificConfig
             :      011 1                :samplingFrequencyIndex
             :           000 1           :channelConfiguration 1
             :                00         :cpConfig
             :                  0        :directMapping
06           :SLConfigDescrTag
  01         :Length Field:1
     02      :predefined 0x02 Reserved for use in MP4 files

stsz定義如下:


上碼流:


size:00 00 00 14 ===>20

type: 73 74 73 7A====>stsz

version: 00

flags:00 00 00 00

sample_size:00 00 00 00

sample_count: 00 00 00 00

stsc定義如下:

上碼流:


size:00 00 00 10 ===>16

type: 73 74 73 63====>stsc

version: 00

flags:00 00 00 00

entry_count: 00 00 00 00

stts定義如下:


上碼流:

size:00 00 00 10 ===>16

type: 73 74 74 73====>stts

version: 00

flags:00 00 00 00

entry_count: 00 00 00 00

stco定義如下:

上碼流:


size:00 00 00 10 ===>16

type: 73 74 63 6F====>stco

version: 00

flags:00 00 00 00

entry_count: 00 00 00 00

vmhd定義如下:

上碼流:

size:00 00 00 14 ===>20

type: 76 6D 68 64====>vmhd

version: 00

flags:00 00 00 00

graghicsmode: 00 00

opcolor: 00 00   00 00   00 00

avc1定義如下:


上碼流:

size:00 00 00 82===>130

type: 61 76 63 31====>avc1

reserved: 00 00 00 00 00 00

data_reference_index : 00 01

pre_defined0:  00 00

reserved1: 00 00

pre_defined1: 00 00 00 00    00 00 00 00    00 00 00 00

width: 02 80 ====>640

height: 01 68 ====>360

horizresolution: 00 48 00 00

vertresolution: 00 48 00 00

reserved2: 00 00 00 00

frame_count : 00 01

compressorname: 00 00 00 00------32 --- 00 00

depth:  00 18

pre_defined2: FF FF


avcc無法找到說明

參考如下:(部落格https://blog.csdn.net/stn_lcd/article/details/74520031)

 bits      
8   version ( always 0x01 )  
8   avc profile ( sps[0][1] )  
8   avc compatibility ( sps[0][2] )  
8   avc level ( sps[0][3] )  
6   reserved ( all bits on )  
2   NALULengthSizeMinusOne    // 這個值是(字首長度-1),值如果是3,那字首就是4,因為4-1=3  
3   reserved ( all bits on )  
5   number of SPS NALUs (usually 1)  
repeated once per SPS:  
  16     SPS size  
  variable   SPS NALU data  
8   number of PPS NALUs (usually 1)  
repeated once per PPS  
  16    PPS size  
  variable PPS NALU data 


version: 01

sps[0][1]:0x42

sps[0][2]:0xE0

sps[0][3]:0x1E

reserved: 111111

nalulength:11

reserved: 000

nums of sps nulus:00001

sps size: 0x00 0x15 ===>21

sps: 0x27 0x42 0xE0 0x1E 0xA9 0x18 0x14 0x05 0xFF 0x2E 0x00 0xD4 0x18 0x04 0x1A 0xDB 0x0A 0xD7 0xBD 0xF0 0x10

nums of pps nulus: 01

pps size: 00  04 ==>4

pps: 28 DE  09 C0

****************************************以上為moov的box介紹***********************************

*******************************下面開始moof***********************************************

moof定義:

上碼流:


size:00 00 02 60===>608

type: 6D 6F 6F 66====>moof

mfhd定義:

上碼流:

size:00 00 02 60===>608

type: 6D 6F 6F 66====>moof

version: 00

flags:00 00 00 00

sequence_number: 00 00 00 01 ====>1

traf定義:

上碼流:

size:00 00 02 08===>520

type: 74 72 61 66====>traf

tfhd定義:


上碼流:


size:00 00 00 10===>16

type: 74 66 68 64====>tfhd

version: 00

flags:00 00 00 00

track_id: 00 00 00 01 ===>1

tfdt定義:


上碼流:

size:00 00 00 14===>20

type: 74 66 64 74====>tfdt

version: 01

flags:00 00 00

baseMediaDecoderTime: 00 00 00 00    00 00 00 00 

這個時間特別重要,瀏覽器就是根據這個時間來解碼的,另外我算了一下,如果baseMediaDecoderTime為4個位元組,最大可以播放13個小時,所以,後來我還是改成了8個位元組,但是要注意version需要修改為01


trun定義:


上碼流:

size:00 00 02 18===>536

type: 74 72 75 6E====>trun

version: 00

flags:00 03 05

sample_count:00 00 00 40 ====>64

data_offset: 00 00 02 68 ====>616 ==moof總長度+8

first_sample_flags:02 00 00 00===>33554532

sample_duration: 00 00 00 19 ===>25

sample_size: 00 00 79 8B ===> 31115

sample_flags:

sample_composition_time_offset:

*******************************下面開始mdat***********************************************

mdat比較簡單

相關推薦

網頁視訊MP4檔案解析

為了研究如何把H264打包成fMp4檔案,今天先開始研究如何從fMp4中解析出H264資料。fMP4包括ftype+moov+(moof+mdat)*N這種格式組成。Box的定義:ftyp格式:上碼流:size:00 00 00 1C  ===>28type: 66 7

MyBatis逆向工程生成檔案解析

一、mapper介面中的方法解析 mapper介面中的函式及方法 方法 功能說明 int countByExample(UserExample example) thorws SQLExceptio

Android-->MediaMuxer,MediaCodec,AudioRecord及Camera實現音訊視訊混合MP4檔案

本文相當長,讀者請注意… 閱讀之前,我喜歡你已經瞭解了以下內容: 這個開源庫介紹了, 音訊和視訊的錄製, 其實已經夠了~~~,不過視訊的錄製採用的是GLSurfaceView中的Surface方法, 並沒有直接採用TextureView和C

Python邊學邊用--BT客戶端實現BitTorrent檔案解析

import os from datetime import tzinfo from datetime import datetime import bcodec _READ_MAX_LEN = -1 class BTFormatError(BaseException): pass

jmeterjtl檔案解析 jmeterjtl檔案解析

我們知道命令列的方式執行完成jmeter後,會生成jtl檔案,裡面開啟後就是一行行的測試結果,  <httpSample t="1" lt="1" ts="1450684950333" s="true" lb="app.testdelay" rc="200" rm="OK" tn="appd

EasyRTMPMP4檔案進行rtmp點播直播推送(三)

前面已經介紹過EasyRTMP,這裡不再多說,可以網上搜索相關內容。 本文講述下基於libEasyRTMP推送庫實現的MP4檔案的直播推送。Github中Demo的下載地址https://github.com/EasyDarwin/EasyRTMP。Demo中

vue原始碼入口檔案解析

由於專案中經常使用vue,所以這次趁有機會趕緊拜讀下原始碼,體驗下vue原始碼的設計風采。 一、下載原始碼 二、原始碼專案目錄 三、載入core核心入口檔案index.js 通過看原始碼我們可以得知這個入口檔案: (1)引入了幾個物件,包括Vue

實戰mp4檔案解析——對著檔案分析,可以一看

抽了一段時間學習了MP4檔案格式.也解析了一個mp4檔案的樣本.留以自用或幫助需要幫助的人. 其中有些地方本人也不很明白(我也標註了).希望明白的人指點說明. 以下MP4檔案從網上隨意找的.  /////////////////begin ftyp部分的解析 ////////////////////////

Android-音視訊(6):用 MediaExtractor 和 MediaMuxer API 解析和封裝 mp4 檔案

1.MediaExtractor API的作用 作用: 可以把音視訊檔案的音訊和視訊分離,並抽取相應的資料通道,然後進行操作。 如何使用: 先要知道是針對哪個檔案操作,所以要用 setDataSource(String filePath) 設定目標檔案。 然後需要知道

視訊檔案解析--MP4-獲取mp4 檔案資訊

獲取mp4 檔案資訊 2-1.計算電影影象寬度和高度         tkhd – track header atom中找到寬度和高度即是。 2-2. 計算電影聲音取樣頻率 從tkhd – track header atom 中找出audio track 的time sc

7-13爬蟲入門BeautifulSoup對網頁爬取內容的解析

obj logs utf 進行 pan 審查 pri 全球 網頁爬取 通過beautifulsoup對json爬取的文件進行元素審查,獲取是否含有p標簽 # -*- coding:utf-8 -*- from lxml import html import request

SSM整合開發CSV檔案匯入匯出實戰-鍾林森-專題視訊課程

SSM整合開發之CSV檔案匯入匯出實戰—65人已學習 課程介紹         本課程將給大家分享如何基於SSM實現CSV檔案的匯入匯出,並講解目前企業級JavaWeb應用mvc三層模式的開發流程,

Java:簡單的解析XML檔案使用DOM解析

XML簡介 要理解XML,HTML等格式,先來理解文件物件模型DOM    根據 DOM,HTML 文件中的每個成分都是一個節點,這些節點組成了一棵樹。DOM 是這樣規定的:整個文件是一個文件節點每個 HTML 標籤是一個元素節點包含在 HTML 元素中的文字是文字節點每一個 HTML 屬性是一個屬性節

簡單四步抓取騰訊視訊MP4檔案

1. 獲取視訊播放頁地址,如:https://v.qq.com/x/page/j0329yq5lu0.html 2. 視訊正片開播後,在H5播放器的右鍵選單中選擇“複製除錯資訊”。 注意,一定要是H5播放器!不是Flash播放器! 複製出來的資訊如下: {"pid":"5ec03277ec8

如何將視訊MP4檔案轉化成AVI格式?

  如今很多人喜歡在網上下載視訊,視訊轉換的格式在生活中也是很常見的,因此會有很多人將要把視訊MP4檔案轉化成AVI格式,那麼究竟有哪些方法呢?哪些視訊轉化器可以幫助我們呢?以下便是小編給你們介紹的這款好用的軟體,一起往下看吧。   視訊轉換器http://www.xunjieshipin.com/

mybatis原始碼-解析配置檔案(三)配置檔案Configuration解析(超詳細, 值得收藏)

1. 簡介 1.1 系列內容 本系列文章講解的是mybatis解析配置檔案內部的邏輯, 即 Reader reader = Resources.getResourceAsReader("mybatis-config.xml"); SqlSessionFact

dump檔案解析探索.Net的記憶體

前言: 對於需要長時間執行的.net程式,有時需要我們檢視記憶體的使用有沒有記憶體洩露問題。 我們可以從dump檔案中找到答案。 Dump的看點 用dump檔案來分析記憶體,到底我們需要關心哪些點呢? 記憶體的使用情況 HeapSize/object的數量 也就是託管堆使用大小以及託管堆內有

mybatis原始碼-解析配置檔案(四)配置檔案Mapper解析

其中, mappers作為configuration節點的一部分配置, 在本文章中, 我們講解解析mappers節點, 即 xxxMapper.xml 檔案的解析。 1 解析入口 在解析 mybatis-config.xml 時, 會進行解析 xxxMapper.xml 的檔案。 在圖示流程的 XMLCo

mybatis原始碼-解析配置檔案(四-1)配置檔案Mapper解析(cache)

1. 簡介 本文章主要講解的是, xxxMapper.xml 檔案中, cache 節點的原始碼。 2. 解析 XMLMapperBuilder.cacheElement() 方法主要負責解析 <cache> private void cacheElement(XNode context)

統計系列配置檔案解析

運用讀取資料庫的配置檔案為例子: 1.首先來看一下配置檔案的格式: [rds_mysql] ip=localhost port=3306 db=test1,test2 user=root passwd=123456 enable=1 2.利用configparser