2012-12-21 42 views
0

我想知道如何訪問mp4視頻文件的GOV標頭的內容。如何訪問MPEG4文件的GOV標頭內容?

我正在使用移軸鏡頭在RTSP,其存儲在MP4格式的硬盤中的視頻流。根據文檔,相機在MPEG4 GOV標頭中插入特定的觸發數據,但我不知道如何訪問或檢索這些信息。

我開發一個C++應用程序,但現在我並不需要以編程方式處理數據,這樣一個解決方案,允許GOV標題內容的可視化將是對我來說足夠。

回答

0

補充數據通常嵌入到數據流中,據推測會寫入到MP4文件的視頻有效載荷數據中。其目的是保留整個MPEG-4標準流,仍然有附加數據在裏面。解碼器通常會忽略它。

您通常需要以流數據從該文件返回並解析流與觸發信息來提取數據的部分。您需要特定的視頻流API(文件格式/解複用器等 - 您的操作系統和環境究竟是什麼?),您需要Axis技術信息來查看它們究竟是什麼嵌入以及您需要如何解析這些信息。

+0

我在Windows 7下用發展着的Visual C++ 2008 Express Edition。該文檔指出,觸發器數據塊作爲「用戶數據」包含在GOV標題中,該GOV標題可能包含以這種格式彼此相繼的幾個數據塊。用戶數據部分以000001b2(十六進制)開頭,觸發數據以0a03(十六進制)開頭。 –

0

如果正在流傳輸RTSP,MPEG4的頭將不被髮送 - 而不是「SDP」(會話描述協議)信息通過來自客戶端的請求DESCRIBE交換。此sdp文件包含實際從mpeg4頭中的MDAT原子獲取的幀速率等的編碼版本。

如果特別需要訪問GOV原子以確定P幀的I幀的差分,則可以嘗試解析服務器上的MPEG4頭和通過單獨的信道發送它。

的MPEG4頭的樣子基本上是一個純文本的原子名稱,然後的長度一般爲4個字節(你需要字節交換取決於您的平臺),然後數據。

下面是一些調試代碼我有我的MPEG4文件頭撰寫剖析:

public boolean valid_atom(byte[] word, int offset) { 
    for (int i = 0; i < 4; i++) 
     if (!(word[i + offset] >= 'a' && word[i + offset] <= 'z') && !(word[i + offset] >= 'A' && word[i + offset] <= 'Z')) 
      return false; 
    return true; 
} 

...

public int parse_atom(byte[] b, int offset, int depth) { 
    int len; 
    len = ifba(b, offset); 
    Log.d(TAG, String.format("atom: %c%c%c%c depth %d @ %d len %d", b[offset + 4], b[offset + 5], b[offset + 6], b[offset + 7], depth, offset, len)); 
    return len; 
} 

...

private int ifba(byte[] buffer, int offset) { 
    int retval = (buffer[offset] & 0xFF) << 24; 
    retval += (buffer[offset + 1] & 0xFF) << 16; 
    retval += (buffer[offset + 2] & 0XFF) << 8; 
    retval += (buffer[offset + 3] & 0XFF); 
    return retval; 
}