2012-09-20 64 views
1

我使用v4l2從Logitech C920 webcamera中讀取H.264幀。我如何在我的程序中獲得他們的PTS和DTS?例如,我可以使用該功能確定幀類型:如何獲得H.264幀的DTS和PTS?

// < 0 = error 
// 0 = I-Frame 
// 1 = P-Frame 
// 2 = B-Frame 
// 3 = S-Frame 
int VOutVideoStream::getVopType(const std::vector<uint8_t>& image) 
{ 
    if(image.size() < 6) 
     return -1; 
    unsigned char *b = (unsigned char*)image.data(); 

    // Verify NAL marker 
    if(b[ 0 ] || b[ 1 ] || 0x01 != b[ 2 ]) { 
     ++b; 
     if (b[ 0 ] || b[ 1 ] || 0x01 != b[ 2 ]) 
      return -1; 
    } 

    b += 3; 

    // Verify VOP id 
    if(0xb6 == *b) { 
     ++b; 
     return (*b & 0xc0) >> 6; 
    } 

    switch(*b) { 
    case 0x65: return 0; 
    case 0x61: return 1; 
    case 0x01: return 2; 
    } 

    return -1; 
} 

回答

1

PTS和DTS是不是H.264比特流的一部分。

通常,PTS與從相機抓取的幀相關聯。 如果你的相機沒有提供API來獲取幀的PTS和DTS,你可以使用類似gettimeofday()這樣的幀作爲幀的點。

在相機已經輸出H.264編碼幀的情況下,您還需要考慮用於編碼的GOP結構,儘管我猜測如果相機已經輸出H.264,一個API來獲取信息。

+0

謝謝你,拉爾夫。 ffmpeg能夠將我的相機的比特流轉換爲avi文件。它從stdin讀取流。它在哪裏獲取關於PTS和DTS的信息? – dasg

+0

它可能使用gettimeofday之類的東西(http://forums.logitech.com/t5/Webcams/Is-it-possible-to-adjust-C920-H-264-GOP-size-from-300-to-lower/td-p/831629看起來相機可能會輸出IDR,然後是一堆P幀,在這種情況下,PTS = DTS,也可以通過爲每個連續幀添加適當的幀持續時間來計算時間戳。 – Ralf