Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этом разделе описывается, когда и как использовать приемник H.264/AVC Remux MFT и MP4.
Когда следует использовать H.264/AVC Remux MFT
Формат файла MPEG-4 требует, чтобы каждый сжатый семпл содержал один первичный кадр с NAL-единицами в правильном порядке. (См. определение первичного изображения и обязательного порядка единиц NAL в разделе 7.4.1.2.3, порядок единиц NAL и закодированных изображений и сопоставление с доступными единицамиспецификации H.264 AVC.) Он также требует, чтобы каждый сжатый образец был связан с меткой времени презентации, меткой времени декодирования и длительностью образца.
Во многих сценариях, когда приложениям требуется записать видео H.264/AVC в контейнере файлов MPEG-4, сжатый образец может не соответствовать указанным выше требованиям. Например, один сжатый пример может не содержать полное первичное изображение или не иметь правильной метки времени презентации. Ниже приведены некоторые примеры приложений.
- Записывать элементарное видео H.264/AVC потокового вещания в контейнер файлов MPEG-4.
- Камера записывает элементарное видео H.264/AVC в контейнере файлов MPEG-4.
- Записывайте видеоконференцию H.264/AVC в контейнер файлов MPEG-4.
- Конкатенация двух видеофайлов H.264/AVC в формате MPEG-2 TS или MP4 и запись их в контейнер файла MPEG-4 с корректными временными метками.
- Выполните Remux видео H.264/AVC из форматов AVCHD, MPEG-2 TS/PS в формат файла MPEG-4.
- Обрезка видеофайла H.264/AVC без перекодирования.
В этой ситуации приложению необходимо использовать MFT H.264/AVC для преобразования сжатых образцов, не содержащих полного первичного рисунка, прежде чем они записываются в контейнер файлов 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, так как длительность выборки для примера, не содержащего полного первичного рисунка, не имеет четкого значения. Вместо этого длительность выборки вычисляется по частоте кадров. Частота кадров вычисляется из параметра последовательности. Если сведения не существуют в параметре последовательности, скорость кадров вычисляется из параметров входного типа носителя. Если сведения о частоте кадров недоступны, используется частота кадров по умолчанию 29,97 fps.
H.264/AVC remux MFT линейно интерполирует метки времени декодирования (DTS) для каждого сжатого изображения в соответствии с частотой кадров. H.264/AVC remux MFT учитывает метки времени входной презентации (PTS) в входных примерах и передает их в выходные данные, если они существуют. Он выполняет интерполяцию PTS в соответствии с частотой кадров, предыдущими PTS и порядком вывода рисунков с помощью процесса буферизации декодированных рисунков (DBP), как указано в приложении C.4.5.3 сбойного процесса спецификации AVC H.264. Каждый выходной пример из MFT H.264/AVC должен содержать PTS, DTS и длительность выборки. H.264/AVC remux MFT также определяет изображения IDR в битовом потоке и задает их как чистую точку с атрибутом MF MFSampleExtension_CleanPoint.
В настоящее время переработчик MFT для H.264/AVC может обрабатывать не более 64 переупорядоченных кадров. Если число переупорядоченных кадров превышает 64 при наличии долгосрочного эталонного кадра, то в H.264/AVC remux MFT будет интерполирован неправильный PTS для этого кадра, и он будет воспроизведен в неверное время.
Чтобы создать экземпляр MFT H.264/AVC, задайте правильные типы входных и выходных носителей на MFT H.264/AVC, задайте тип входного носителя для приемника 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);
Связанные разделы