Microsoft MFCreateFMPEG4MediaSink для создания DASH-совместимых файлов mp4 - PullRequest
0 голосов
/ 02 февраля 2019

Возможно ли создание MASH-файлов, совместимых с DASH, с помощью MFCreateFMPEG4MediaSink.

API говорит, что MFCreateFMPEG4MediaSink поддерживает фрагментированный mp4.Это поведение по умолчанию или нам нужно установить некоторые флаги.

Когда я пытаюсь воспроизвести файлы, созданные MFCreateFMPEG4MediaSink в MediaSource в javascript, он не воспроизводится.Я проверяю сгенерированный файл с помощью MP4Box.js и он говорит, что он не фрагментирован.

Спасибо ОБНОВЛЕНИЕ:

  IMFMediaBuffer * pBuffer;
    // Create a new memory buffer.
    HRESULT hr = MFCreateMemoryBuffer(data_length, &pBuffer);

    BYTE *pData = NULL;
    // Lock the buffer and copy the video frame to the buffer.
    if (SUCCEEDED(hr))
    {
        DWORD buffLen = data_length;
        hr = pBuffer->Lock(&pData,NULL, NULL);
    }

    if (SUCCEEDED(hr))
    {
        memcpy(pData, data, data_length);
    }

    if (pBuffer)
    {
        pBuffer->Unlock();
    }

    // Set the data length of the buffer.
    if (SUCCEEDED(hr))
    {
        hr = pBuffer->SetCurrentLength(data_length);
    }

    // Create a media sample and add the buffer to the sample.
    IMFSample * pSample;
    if (SUCCEEDED(hr))
    {
        hr = MFCreateSample(&pSample);
    }
    if (SUCCEEDED(hr))
    {
        hr = pSample->AddBuffer(pBuffer);
    }

    // Set the time stamp and the duration.
    if (SUCCEEDED(hr))
    {
        hr = pSample->SetSampleTime(rtStart);
    }
    if (SUCCEEDED(hr))
    {
        hr = pSample->SetSampleDuration(video_frame_duration);
    }
    rtStart += video_frame_duration;
    /*if (SUCCEEDED(hr))
    {
        hr = pSample->SetUINT32(MFSampleExtension_CleanPoint, isIDR);
    }*/
    //pSample->
    // Send the sample to the Sink Writer.
    if (SUCCEEDED(hr))
    {
        hr = pSinkWriter->WriteSample(0, pSample);
    }

    SafeRelease(&pSample);
    SafeRelease(&pBuffer);
    return 1;

ЭТО ГДЕ Я СОЗДАЮ РАБОТУ

if (SUCCEEDED(hr))
    {
        hr = MFCreateMediaType(&pMediaType);
    }
    //unsigned char * pSeqHdr = reinterpret_cast<UINT8 *>(mSamplesQueue.SequenceHeader());
    /*
    if (SUCCEEDED(hr))
    {
        hr = pMediaType->SetBlob(MF_MT_MPEG_SEQUENCE_HEADER, blob, 25);
    }
    UINT32 pcbBlobSize = { 0 };
    hr = pMediaType->GetBlobSize(MF_MT_MPEG_SEQUENCE_HEADER, &pcbBlobSize);
    */


    /*if (SUCCEEDED(hr)) {
        hr = pMediaType->SetUINT32(MF_MPEG4SINK_MOOV_BEFORE_MDAT, 1);
    }*/
    if (SUCCEEDED(hr))
    {
        hr = pMediaType->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Video);
    }
    if (SUCCEEDED(hr))
    {
        hr = pMediaType->SetGUID(MF_MT_SUBTYPE, MFVideoFormat_H264);
    }
    if (SUCCEEDED(hr))
    {
        hr = MFSetAttributeRatio(pMediaType, MF_MT_FRAME_RATE, frame_rate, 1);
    }
    if (SUCCEEDED(hr))
    {
        hr = pMediaType->SetUINT32(MF_MT_AVG_BITRATE, bit_rate);
    }
    if (SUCCEEDED(hr))
    {
        hr = pMediaType->SetUINT32(MF_MT_INTERLACE_MODE, MFVideoInterlace_Progressive);
    }
    if (SUCCEEDED(hr))
    {
        hr = MFSetAttributeSize(pMediaType, MF_MT_FRAME_SIZE, width, height);
    }
    if (SUCCEEDED(hr))
    {
        // Pixel aspect ratio
        hr = MFSetAttributeRatio(pMediaType, MF_MT_PIXEL_ASPECT_RATIO, 1, 1);
    }


if (SUCCEEDED(hr))
    {
        hr = MFCreateFile(
            MF_ACCESSMODE_READWRITE,
            MF_OPENMODE_DELETE_IF_EXIST,
            MF_FILEFLAGS_NONE,
            L"output2temp.mp4",
            &pByteStream);
    }

    if (SUCCEEDED(hr))
    {
        hr = MFCreateMPEG4MediaSink(
            pByteStream,
            pMediaType,
            NULL,
            &pMediaSink);
    }
...