網頁視訊之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
沒有找到定義,不知道哪位高手知道在哪裡。直接上碼流:
工具解析截圖如下:
參考這裡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
jmeter之jtl檔案解析 jmeter之jtl檔案解析
我們知道命令列的方式執行完成jmeter後,會生成jtl檔案,裡面開啟後就是一行行的測試結果, <httpSample t="1" lt="1" ts="1450684950333" s="true" lb="app.testdelay" rc="200" rm="OK" tn="appd
EasyRTMP之MP4檔案進行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