Condividi tramite


Quando e come usare il sink H.264/AVC Remux MFT e MP4

Questo argomento descrive quando e come usare un H.264/AVC Remux MFT e un MP4 Sink.

Quando usare H.264/AVC Remux MFT

Il formato di file MPEG-4 richiede che ogni campione compresso contenga un'immagine primaria con unità NAL nell'ordine corretto. Fare riferimento alla definizione dell'ordine delle unità NAL primarie e obbligatorie nella sezione 7.4.1.2.3, Ordine di unità NAL e immagini codificate e associazione alle unità di accesso, della specifica H.264 AVC. Richiede inoltre che ogni campione compresso sia associato a un timestamp di presentazione, a un timestamp di decodifica e alla durata del campione.

In molti scenari in cui le applicazioni devono registrare video H.264/AVC in un contenitore di file MPEG-4, l'esempio compresso potrebbe non soddisfare i requisiti precedenti. Ad esempio, un esempio compresso potrebbe non contenere un'immagine primaria completa o non avere un timestamp di presentazione corretto associato. Alcuni esempi di applicazione sono:

  • Scrivere video elementari di streaming H.264/AVC nel contenitore di file MPEG-4.
  • La videocamera ha registrato un video elementare H.264/AVC in un contenitore di file MPEG-4.
  • Registrare la videoconferenza H.264/AVC nel contenitore di file MPEG-4.
  • Concatenare due video H.264/AVC in MPEG-2 TS o MP4 e salvare nel contenitore MPEG-4 con timestamp corretti.
  • Remux dei video in H.264/AVC dal formato di file AVCHD, MPEG-2 TS/PS al formato di file MPEG-4.
  • Tagliare il file video H.264/AVC senza transcodifica.

In questo caso, l'applicazione deve usare un MFT H.264/AVC per convertire i campioni compressi che non contengono un'immagine primaria completa prima di essere scritti nel contenitore di file MPEG-4.

Come usare il sink MP4 e il Remux MFT H.264/AVC

Impostare il tipo di supporto di output di origine su MFVideoFormat_H264_ES, che indica che ogni esempio potrebbe non contenere un'immagine primaria completa. Impostare il tipo di supporto di input per il sink MP4 su MFVideoFormat_H264. Pertanto, il tipo di supporto di input del modulo H.264/AVC remux MFT è MFVideoFormat_H264_ES e il tipo di supporto di output del modulo H.264/AVC remux MFT è MFVideoFormat_H264, che verrà inserito automaticamente nel resolver della topologia.

La durata del campione viene ignorata dal remux H.264/AVC, perché la durata del campione non ha un significato chiaro quando non contiene un'immagine primaria completa. Al contrario, la durata del campione viene calcolata dalla frequenza dei fotogrammi. La frequenza dei fotogrammi viene calcolata dal parametro della sequenza. Se le informazioni non esistono nel parametro della sequenza, la frequenza dei fotogrammi viene calcolata dai parametri nel tipo di supporto di input. Se le informazioni sulla frequenza dei fotogrammi non sono disponibili, viene usata la frequenza dei fotogrammi predefinita di 29,97 fps.

H.264/AVC remux MFT interpola in modo lineare i timestamp di decodifica (DTS) per ogni immagine compressa in base alla frequenza dei fotogrammi. H.264/AVC remux MFT rispetta i timestamp del tempo di presentazione dell'input (PTS) nei campioni di input e li passa all'output, se presenti. Esegue l'interpolazione PTS in base alla frequenza dei fotogrammi, al pts precedente e all'ordine di output dell'immagine tramite il processo DBP (Decoded Picture Buffering), come specificato in allegato C.4.5.3 Processo di bumping della specifica AVC H.264. Ogni esempio di output di H.264/AVC remux MFT deve avere PTS, DTS e durata del campione. H.264/AVC remux MFT identifica anche le immagini IDR nel bitstream e le imposta come punto pulito con l'attributo MF di MFSampleExtension_CleanPoint.

Attualmente il modulo H.264/AVC remux MFT può gestire un massimo di 64 fotogrammi riordinati. Se il numero di fotogrammi riordinati supera 64 con un frame di riferimento a lungo termine presente, H.264/AVC remux MFT interpolerà un PTS errato per tale frame e restituirà tale frame in un momento errato.

Per creare un'istanza di H.264/AVC remux MFT, impostare i tipi di media di input e output corretti sull'H.264/AVC remux MFT, definire il tipo di media di input per il sink MP4 e configurare la topologia.

Il codice di esempio seguente illustra come inizializzare il remux MFT H.264/AVC e il sink MP4.

Per H.264/AVC remux MFT,

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

Non è necessaria alcuna configurazione aggiuntiva.

Per il ricevitore 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);

Formati multimediali supportati in Media Foundation