1. 程式人生 > >視訊檔案頭解析--MP4-獲取mp4 檔案資訊

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

獲取mp4 檔案資訊

2-1.計算電影影象寬度和高度

        tkhd – track header atom中找到寬度和高度即是。

2-2. 計算電影聲音取樣頻率

從tkhd – track header atom 中找出audio track 的time scale 即是聲音的取樣頻率。

2-3. 計算視訊幀率

首先計算出整部電影的duration,和幀的數目然後   幀率=整部電影的duration / 幀的數目

2-4. 計算電影的位元率

整部電影的尺寸除以長度,即是位元率,此電影的位元率為846623/70= 12094 bps

2-5. 查詢sample

當播放一部電影或者一個track

的時候,對應的media handler 必須能夠正確的解析資料流,對一定的時間獲取對應的媒體資料。如果是視訊媒體,media handler 可能會解析多個atom,才能找到給定時間的sample 的大小和位置。具體步驟如下:

1.確定時間,相對於媒體時間座標系統

2.檢查time-to-sample atom來確定給定時間的sample 序號。

3.檢查sample-to-chunk atom來發現對應該sample 的chunk。

4.從chunk offset atom中提取該trunk 的偏移量。

5.利用sample size atom找到sample在trunk 內的偏移量和sample 的大小。例如,如果要找第1 秒的視訊資料,過程如下:

5-1. 第1秒的視訊資料相對於此電影的時間為600

5-2. 檢查time-to-sample atom,得出每個sample 的duration 是40,從而得出需要尋找第600/40= 15 + 1 = 16 個sample

5-3. 檢查sample-to-chunk atom,得到該sample 屬於第5 個chunk 的第一個sample,該chunk 共有4 個sample

5-4. 檢查chunk offset atom找到第5 個trunk 的偏移量是20472

5-5. 由於第16個sample 是第5 個trunk 的第一個sample,所以不用檢查sample size atom,trunk 的偏移量即是該sample 的偏移量20472。如果是這個trunk 的第二個sample,則從samplesize atom 中找到該trunk 的前一個sample 的大小,然後加上偏移量即可得到實際位置。

5-6. 得到位置後,即可取出相應資料進行解碼,播放

2.6. 查詢關鍵幀

查詢過程與查詢sample的過程非常類似,只是需要利用sync sample atom 來確定key frame 的sample 序號

1. 確定給定時間的sample序號

2. 檢查sync sample atom來發現這個sample序號之後的key frame

3. 檢查sample-to-chunk atom來發現對應該sample 的chunk

4. 從chunk offset atom中提取該trunk的偏移量

5. 利用sample size atom找到sample在trunk 內的偏移量和sample 的大小

2.7. Random access

Seeking 主要是利用sample table box 裡面包含的子box 來實現的,還需要考慮edit list 的影響。可以按照以下步驟seek 某一個track 到某個時間T,注意這個T 是以movie header box 裡定義的time scale 為單位的:

1.如果track有一個edit list,遍歷所有的edit,找到T 落在哪個edit 裡面。將Edit開始時間變換為以movie time scale 為單位,得到EST,T 減去EST,得到T',就是在這個edit裡面的duration,注意此時T'是以movie 的timescale 為單位的。然後將T'轉化成track媒體的time scale,得到T''。T''與Edit 的開始時間相加得到以track 媒體的time scale 為單位的時間點T'''。

2.這個track 的time-to-sample 表說明了該track 中每個sample 對應的時間資訊,利用這個表就可以得到T'''對應的sample NT。

3.sample NT 可能不是一個random access point,這樣就需要其他表的幫助來找到最近的random access point。一個表是sync sample 表,定義哪些sample 是random access point。使用這個表就可以找到指定時間點最近的sync sample。如果沒有這個表,就說明所有的sample 都是synchronization points,問題就變得更容易了。另一個shadowsync box 可以幫助內容作者定義一些特殊的samples,它們不用在網路中傳輸,但是可以作為額外的random access point。這就改進了random access,同時不會影響正常的傳輸位元率。這個表指出了非random access point 和random access point 之間的關係。如果要尋找指定sample 之前最近的shadow sync sample,就需要查詢這個表。總之,利用sync sample 和shadow sync 表,就可以seek 到NT 之前的最近的accesspoint sample Nap。

4.找到用於access point 的sample Nap 之後,利用sample-to-chunk 表來確定sample 位於哪個chunk 內。

5. 找到chunk 後,使用chunk offset 找到這個chunk 的開始位置。

6. 使用sample-to-chunk 表和sample size 表中的資料,找到Nap 在此chunk 內的位置,再加上此chunk 的開始位置,就找到了Nap 在檔案中的位置。

相關推薦

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

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

視訊檔案解析--MP4-綜述

MP4 檔案格式 綜述 關鍵概念         MP4 檔案格式中,所有的內容存在一個稱為movie 的容器中。一個movie 可以由多個tracks 組成。每個track 就是一個隨時間變化的媒體序列,例如,視訊幀序列。track 裡的每個時間單位是一個sample,它

視訊檔案解析--mpeg-個人對mpg檔案結構的理解

1、一個mpg檔案可以只包含視訊內容,那麼檔案開頭以0x000001B3作為起始碼 2、以0x000001BA 開頭,就意味著同時包含音訊資料和視訊資料,如果沒有音訊資料,則以0x000001B3開頭 3、一個mpg檔案可以包含多個pack,每個pack的起始碼都是0x0

MP4檔案格式解析,及MP4檔案的分割演算法

MP4檔案格式的解析,以及MP4檔案的分割演算法   mp4應該算是一種比較複雜的媒體格式了,起源於QuickTime。以前研究的時候就花了一番的功夫,尤其是如何把它完美的融入到視訊點播應用中,更是費盡了心思,主要問題是處理mp4檔案龐大的“媒體頭”。當然,流媒體點播也可以

oracle日誌檔案解析

首先,日誌檔案的格式如下: redo logfile的結構 block 0: file header block 1: redo header block 2: redo record 1 block 3: redo record 2 ... ... block N: re

wav音訊檔案解析

#include <stdio.h> #include <stdlib.h> #include <string.h> #include "wav.h" /* func : endian judge * return : 0-big-endian othes-litt

JPEG解碼——(3)檔案解析

  與具體的編碼資料空間相比,jpeg檔案頭佔據非常小乃至可以忽略不計的大小。   仍然拿JPEG解碼--(1)JPEG檔案格式概覽中的《animal park》這張圖片來舉例,從跳過SOS(FF DA)的TAG開始——0x153, 就真正進入了編碼資料區域,如下圖所示:   其佔據的比例為:0x153/

利用Scanner類對檔案讀取,並獲取相應的資訊

package input; import java.io.File; import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.List; import java.util.Scanner

利用檔案來實現的一些檔案型別的方法封裝

package com.opslab.util.algorithmImpl; import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import jav

H264解析sps獲取解析度等資訊

#include <stdio.h> #include <stdint.h> #include <string.h> #include <math.h>   typedef  unsigned int UINT; typedef &

Volly 解析VolleyError獲取包體資訊

在使用Volly開源框架時遇到了一個問題,報了錯誤只有一個 SERVERERROR , 那怎麼辦呢,找谷哥咯,貼上搜索下發現是伺服器的響應的一個錯誤,最有可能的4xx或5xx HTTP狀態程式碼。 一般我們使用Volly列印日誌是用 Log.e(“Voll

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

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

MP4檔案格式的解析,以及MP4檔案的分割演算法

mp4應該算是一種比較複雜的媒體格式了,起源於QuickTime。以前研究的時候就花了一番的功夫,尤其是如何把它完美的融入到視訊點播應用中,更是費盡了心思,主要問題是處理mp4檔案龐大的“媒體頭”。當然,流媒體點播也可以採用flv格式來做,flv也可以封裝H.264視訊資料的

如何使用mp4v2將H264+AAC裸流錄製成mp4檔案,並保持音視訊同步【原始碼】【mp4】【錄影】

前言:    mp4檔案目前已經成為了流媒體音視訊行業的通用標準檔案格式,它是基於mov格式基礎上演變來的,特別適合多平臺播放,錄製一次,多個平臺都可使用。但是,由於mp4格式相對比較複雜,直到mp4v2這個開源工程的出現,解決了這個問題。    通常,我們在使用mp4檔案時

MP4Box獲取MP4媒體檔案的播放時長

最近開始對流媒體進行深入瞭解, 發現裡面真是太複雜了, 真是很佩服做流媒體的朋友, 廢話不多說, 最近接觸MP4Box這個開源庫,進行MP4檔案的解析, 剛接觸找不到MP4檔案播放時長的引數, 按說不應該的, 將引數資訊輸出檢視, 發現CMp4_root_box.moov.m

如何從mp4檔案獲取幀率資訊

用mediainfo檢視mp4經常會看到有兩個幀率資訊,一個是framerate,一個是original framerate,前者是檔案的實際幀率,後者是h264解碼資訊中的幀率。 計算實際幀率時,需要從mp4的moov box中的mvhd中取得timescale和dura

MP4系列之--如何獲取mp4檔案資訊

        轉自http://zhangwenxin82.blog.163.com/blog/static/1145959562009612024837/,轉載請註明出處。 計算電影長度 方法1 從mvhd - movie header atom中找到time sca

利用ffmpeg修改MP4檔案資訊,使其支援流式載入及播放

最近在用AS3寫一個Flash的播放器,發現同樣都是H264編碼的mp4檔案,有的可以載入一點就開始播放,有的就必須全部載入完才能播。用本地播放器(potplayer,暴風影音等)開啟檢視,發現編碼什麼的也都是一樣的:左邊這個必須是全部載入完成才能播,右邊這個是一載入就能播。

Android-通過網路獲取xml檔案使用pull解析得到伺服器中的資訊(新聞客戶端)

通過網路獲取xml檔案,使用pull解析該檔案得到伺服器中的資訊; demo中使用了一個開源的圖片載入包,故上傳原始碼方便檢視; 效果圖: 步驟: 1.連線伺服器獲取xml檔案; 2.使用pull解析xml檔案存入實體物件中; 3.解析後將實體物件存入List集合中;

PE檔案解析-檔案與整體介紹

一、PE的基本概念     PE(Portable Execute)檔案是Windows下可執行檔案的總稱,常見的有DLL,EXE,OCX,SYS等,事實上,一個檔案是否是PE檔案與其副檔名無關,PE檔案可以是任何副檔名。     認識PE檔案不是作為單一