Bagikan melalui


Kapan dan Cara Menggunakan H.264/AVC Remux MFT dan MP4 Sink

Topik ini menjelaskan kapan dan bagaimana menggunakan H.264/AVC Remux MFT dan MP4 Sink.

Kapan menggunakan H.264/AVC Remux MFT

Format file MPEG-4 mengharuskan setiap sampel terkompresi berisi satu gambar utama dengan unit NAL dalam urutan yang benar. (Silakan lihat definisi gambar utama dan urutan unit NAL wajib di bagian 7.4.1.2.3, Urutan unit NAL dan gambar berkode dan asosiasi untuk mengakses unit, dari spesifikasi H.264 AVC.) Ini juga mengharuskan setiap sampel terkompresi dikaitkan dengan stempel waktu presentasi, stempel waktu decoding, dan durasi sampel.

Dalam banyak skenario ketika aplikasi perlu merekam video H.264/AVC dalam kontainer file MPEG-4, sampel terkompresi mungkin tidak memenuhi persyaratan di atas. Misalnya, satu sampel terkompresi mungkin tidak berisi gambar utama lengkap atau mungkin tidak memiliki stempel waktu presentasi yang benar yang terkait dengannya. Beberapa contoh aplikasi adalah:

  • Tuliskan video dasar yang dialirkan dalam format H.264/AVC ke dalam wadah berkas MPEG-4.
  • Kamera merekam video H.264/AVC dasar dalam kontainer berkas MPEG-4.
  • Rekam konferensi video H.264/AVC dalam kontainer file MPEG-4.
  • Gabungkan dua video H.264/AVC di MPEG-2 TS atau MP4 dan tulis ke dalam kontainer file MPEG-4 dengan stempel waktu yang benar.
  • Remux H.264/AVC video dari AVCHD, format file MPEG-2 TS/PS ke format file MPEG-4.
  • Pangkas file video H.264/AVC tanpa transkode.

Dalam situasi ini, aplikasi perlu menggunakan MFT remux H.264/AVC untuk mengonversi sampel terkompresi yang tidak berisi gambar utama lengkap sebelum ditulis ke dalam kontainer file MPEG-4.

Cara menggunakan H.264/AVC Remux MFT dan sink MP4

Atur jenis media output sumber ke MFVideoFormat_H264_ES, yang menunjukkan setiap sampel mungkin tidak berisi gambar utama lengkap. Atur jenis media input sink MP4 ke MFVideoFormat_H264. Jadi, jenis media input MFT remux H.264/AVC MFVideoFormat_H264_ES dan jenis media output MFT remux H.264/AVC MFVideoFormat_H264, yang akan secara otomatis dimasukkan ke dalam penyelesai topologi.

Durasi sampel diabaikan oleh remuks H.264/AVC, karena durasi sampel untuk sampel yang tidak berisi gambar utama lengkap tidak memiliki arti yang jelas. Sebagai gantinya, durasi sampel dihitung dari laju bingkai. Kecepatan bingkai dihitung dari parameter rangkaian. Jika informasi tidak ada dalam parameter urutan, frame rate dihitung dari parameter dalam tipe media masukan. Jika informasi kecepatan bingkai tidak tersedia, kecepatan bingkai default 29,97 fps digunakan.

H.264/AVC remux MFT secara linier menginterpolasi cap waktu dekode (DTS) untuk setiap gambar terkompresi sesuai dengan laju bingkai. MFT remux H.264/AVC menghormati stempel waktu presentasi input (PTS) dalam sampel input dan meneruskannya ke output jika ada. Ini melakukan interpolasi PTS sesuai dengan kecepatan bingkai, PTS sebelumnya, dan urutan output gambar melalui proses bumping Decoded Picture Buffering (DBP) seperti yang ditentukan dalam Annex C.4.5.3 Proses bumping spesifikasi H.264 AVC. Setiap sampel keluaran dari MFT remux H.264/AVC harus memiliki PTS, DTS, dan durasi sampel. MFT remux H.264/AVC juga mengidentifikasi gambar IDR di bitstream dan menetapkannya sebagai titik bersih dengan atribut MF MFSampleExtension_CleanPoint.

Saat ini MFT remux H.264/AVC dapat menangani maksimum 64 bingkai yang diurutkan ulang. Jika jumlah bingkai yang diurutkan ulang melebihi 64 dengan bingkai referensi jangka panjang yang ada, MFT remux H.264/AVC akan menginterpolasi PTS yang salah untuk bingkai tersebut dan output bingkai tersebut pada waktu yang salah.

Untuk membuat instans MFT remux H.264/AVC, atur jenis media input dan output yang benar pada MFT remux H.264/AVC, atur jenis media input untuk sink MP4, dan selesaikan topologi.

Kode sampel berikut menunjukkan cara menginisialisasi remux MFT H.264/AVC dan MP4 sink.

Untuk remux MFT H.264/AVC,

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

Tidak ada konfigurasi lebih lanjut yang diperlukan.

Untuk penyimpanan 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);

Format Media yang Didukung di Media Foundation