共用方式為


何時及如何使用 H.264/AVC Remux MFT 和 MP4 接收

本主題描述使用 H.264/AVC Remux MFT 和 MP4 接收的時機和方式。

使用 H.264/AVC Remux MFT 的時機

MPEG-4 檔案格式需要每個壓縮的樣本包含一個主要圖片,且 NAL 單位的順序正確。 (請參閱第 7.4.1.2.3 節中主要圖片和強制 NAL 單位順序的定義、 NAL 單位順序,以及存取單位的編碼圖片和關聯,H.264 AVC 規格.) 它也需要每個壓縮的樣本都與簡報時間戳記、解碼時間戳記和範例持續時間相關聯。

在許多情況下,當應用程式需要在 MPEG-4 檔案容器中錄製 H.264/AVC 視訊時,壓縮的範例可能無法滿足上述需求。 例如,一個壓縮的範例可能不會包含完整的主要圖片,或可能沒有與其相關聯的正確簡報時間戳記。 一些應用程式範例包括:

  • 將 H.264/AVC 串流基礎視訊寫入 MPEG-4 檔案容器。
  • 錄製相機在 MPEG-4 檔案容器中擷取 H.264/AVC 基本視訊。
  • 在 MPEG-4 檔案容器中錄製 H.264/AVC 視訊會議。
  • 在 MPEG-2 TS 或 MP4 中串連兩個 H.264/AVC 視訊,並使用正確的時間戳記寫入 MPEG-4 檔案容器。
  • 從 AVCHD、MPEG-2 TS/PS 檔案格式到 MPEG-4 檔案格式的 Remux H.264/AVC 視訊。
  • 修剪 H.264/AVC 視訊檔案而不轉碼。

在此情況下,應用程式必須使用 H.264/AVC remux MFT,在將未包含完整主要圖片的壓縮樣本寫入 MPEG-4 檔案容器之前轉換。

如何使用 H.264/AVC Remux MFT 和 MP4 接收

將來源輸出媒體類型設定為 MFVideoFormat_H264_ES,這表示每個樣本可能不會包含完整的主要圖片。 將 MP4 接收的輸入媒體類型設定為 MFVideoFormat_H264。 因此,H.264/AVC remux MFT 的輸入媒體類型 MFVideoFormat_H264_ES ,且 H.264/AVC remux MFT 的輸出媒體類型 MFVideoFormat_H264,這會自動插入拓撲解析程式。

H.264/AVC remux 會忽略樣本持續時間,因為不包含完整主要圖片的樣本持續時間沒有清楚的意義。 相反地,取樣持續時間是從畫面播放速率計算而來。 畫面播放速率是從序列參數計算而來。 如果順序參數中沒有資訊,則會從輸入媒體類型中的參數計算畫面播放速率。 如果無法使用畫面播放速率資訊,則會使用預設畫面播放速率 29.97 fps。

H.264/AVC remux MFT 會根據畫面播放速率,以線性方式插補每個壓縮圖片的解碼時間戳記 (DTS) 。 H.264/AVC remux MFT 會接受輸入簡報時間戳記 (PTS) 輸入範例,並在存在時將它們傳遞至輸出。 它會根據畫面播放速率、先前的 PTS 和圖片輸出順序,透過解碼的圖片緩衝 (DBP 執行 PTS 插補,) 如 H.264 AVC 規格 的附錄 C.4.5.3 調整程式 所指定。 H.264/AVC remux MFT 的每個輸出範例都應該有 PTS、DTS 和範例持續時間。 H.264/AVC remux MFT 也會識別 bitstream 中的 MP 圖片,並使用 MFSampleExtension_CleanPoint的 MF 屬性將它們設定為清除點。

H.264/AVC remux MFT 目前最多可以處理 64 個重新排序的框架。 如果重新排序的框架數目超過 64 個存在長期參考框架,H.264/AVC remux MFT 會插入該畫面的錯誤 PTS,並在錯誤時間輸出該畫面。

若要具現化 H.264/AVC remux MFT,請在 H.264/AVC remux MFT 上設定正確的輸入和輸出媒體類型、設定 MP4 接收的輸入媒體類型,以及解析拓撲。

下列範例程式碼示範如何初始化 H.264/AVC remux MFT 和 MP4 接收。

針對 H.264/AVC remux MFT,

hr = CoCreateInstance(
            CLSID_CMSH264RemuxMFT,
            NULL,
            CLSCTX_INPROC_SERVER,
            IID_IMFTransform,
            (void**) &pIMFTransform
            );

不需要進一步設定。

針對 MP4 接收,

IMFByteStream*  pMFBSOutputFile = NULL;
hr = MFCreateFile(
    MF_ACCESSMODE_READWRITE,
    MF_OPENMODE_DELETE_IF_EXIST,
    MF_FILEFLAGS_NONE,
    m_pszOutputFile,
    &pMFBSOutputFile);
if(FAILED(hr))
{
    Log(L"ERROR>> Failed to create output file for MP4 Sink (hr=0x%x)", hr);
    break;
}

hr = MFCreateMPEG4MediaSink(
    pMFBSOutputFile,
    (guidMajorType == MFMediaType_Video) ? pMediaType : NULL,  // pMediaType comes from the output type of the remux MFT
    (guidMajorType == MFMediaType_Audio) ? pMediaType : NULL,
    &m_pMediaSink);
if(FAILED(hr))
{
    Log(L"ERROR>> Failed to create MP4 Sink (hr=0x%x)", hr);
    break;
}
hr = m_pMediaSink->GetStreamSinkByIndex(0, &pStream);

媒體基礎中支援的媒體格式