Модификация GDCL MP4 Muxer (неверный верхний / нижний колонтитул) - PullRequest
1 голос
/ 29 ноября 2011

Я хочу изменить GDLC MP4 Muxer так, чтобы

  • он не отправлял данные другому записывающему устройству, а просто записывал их сам в данные файла ...

  • Это больше не будет мультиплексором ... это будет писатель, у которого есть mp4 мультиплексор ...

Но сначала яЯ должен выяснить, где находятся последние [мультиплексированные] данные, чтобы я мог записать их в файл ...

Чтобы получить воспроизводимый файл, я должен записать данные где?

Мои попытки:

Я помещаю отладочную информацию и вижу, что она вызывает Append и этот вызов метода Replace периодически ... я пишу буфер [BYTE pBuffer], который передается методу Append MuxOutput. Я получаю двоичные данные, которые имеют некоторые заголовки, но не воспроизводятся ... Так что это неправильное место или я делаю это неправильно..... Затем я проверяю, что вызывает метод Append --- FillSpace и YUVVideoHandler :: WriteDescriptor ... Но я не могу получить полезную информацию из вызова других методов Appe.nd ...

ОБНОВЛЕНИЕ

Ну, я могу записать данные в файл по методу MuxOutput::Replace ... Проблема в том, что информация заголовка и нижний колонтитул(таблицы в конце файла) ошибочны ... Другие данные [полезные данные] верны ... Воспроизводимый файл, записанный программой записи файлов, начинался с 00 00 00 18 ... [шестнадцатеричное], но мои записанные данные начинаются с 00 00 00 08 [шестнадцатеричное] .... когда я заменяю части верхнего и нижнего колонтитула mp4 файлом, созданным средством записи файлов с использованием инструмента шестнадцатеричного редактора, файлидентичны и играют.

В чем может быть проблема?

Ответы [ 2 ]

2 голосов
/ 29 ноября 2011

В Mpeg4Mux :: Pause MovieWriter создается с указателем на интерфейс AtomWriter (в моем случае это реализуется выходным выводом посредством обращений к нижестоящему фильтру средства записи файлов). Все записи в файл осуществляются через этот интерфейс. Сначала записываются данные, а затем при остановке записываются данные индекса (блок moov), а заголовок файла и заголовки блока данных обновляются.

G

1 голос
/ 01 декабря 2011

Я думаю, что ваша проблема вызвана требованием Random File Access, которое поддерживается по умолчанию File Writer Filter. Шаги, которые вы должны выполнить:

1) Создать пустой файл в начале

std::ofstream outFile;
outFile.open("c:\\out.mp4", ios_base::out | ios_base::binary);
outFile.close();

2) Открыть файл для произвольного доступа

outFile.open("c:\\out.mp4", ios_base::in | ios_base::out | ios_base::binary);

3) Сразу после метода Write() выходного вывода добавьте эти строки (замените position, buffer и bufferSize подходящими именами переменных)

outFile.seekp(position);
outFile.write(buffer, bufferSize);

4) В конце сеанса записи (где-то, как метод Close() мультиплексора), добавьте

outFile.close();

И все готово.

...