Поделиться через


Написание примеров

[Функция, связанная с этой страницей, Windows Media Format 11 SDK, является устаревшей функцией. Он был заменен средством чтения исходного кода и модуля записи приемника. Средство чтения исходного кода и модуль записи приемника оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует, чтобы новый код по возможности использовал средство чтения исходного кода и модуль записи приемника вместо пакета SDK для Windows Media Format 11. Корпорация Майкрософт предлагает переписать существующий код, в котором используются устаревшие API, чтобы по возможности использовать новые API.]

Определив и настроив входные данные для файла, вы можете начать передачу примеров в модуль записи. По возможности следует передавать примеры во время презентации, чтобы сделать процесс написания более эффективным.

Перед передачей каких-либо примеров необходимо настроить модуль записи, чтобы он принимал их, вызвав IWMWriter::BeginWriting.

Чтобы передать пример в модуль записи, выполните следующие действия.

  1. Выделите буфер и получите указатель на интерфейс INSSBuffer , вызвав IWMWriter::AllocateSample.
  2. Получите адрес буфера, созданного на шаге 1, вызвав МЕТОД INSSBuffer::GetBuffer.
  3. Скопируйте пример данных в расположение буфера, убедившись, что переданный пример помещается в выделенный буфер. Для копирования данных можно использовать любую функцию копирования памяти. Распространенный вариант — memcpy, который входит в стандартную библиотеку времени выполнения C.
  4. Обновите объем данных, используемых в буфере, чтобы отразить фактический размер выборки, вызвав МЕТОД INSSBuffer::SetLength.
  5. Передайте интерфейс буфера в модуль записи вместе с входным номером и временем выборки с помощью метода IWMWriter::WriteSample . Все примеры звука для входных данных представляют одинаковую продолжительность содержимого, поэтому вы можете определить время выборки, добавив длительность выборки к итоговой сумме. Для видео необходимо рассчитать время на основе частоты кадров.

WriteSample работает асинхронно и может не завершить запись данных из буфера, прежде чем приложение будет готово к повторному вызову метода. Поэтому важно вызывать AllocateSample один раз для каждого вызова WriteSample. Однако интерфейс INSSBuffer можно освободить сразу после вызова WriteSample.

Завершив передачу примеров, вызовите IWMWriter::EndWriting.

Примечание Важно, чтобы примеры из всех потоков в файле передавались в модуль записи в синхронизации друг с другом. То есть, по возможности следует передавать примеры в модуль записи в порядке времени презентации в пределах допустимости синхронизации, указанной в IWMWriterAdvanced::SetSyncTolerance. Наилучшие результаты достигаются, когда данные доставляются в каждый поток за одну секунду или меньше.

Потоки также должны заканчиваться примерно в то же время. Например, не следует записывать файл со звуковым потоком длиной 45 секунд и видеопотоком длиной 50 секунд. При кодировании такого файла с помощью неотправленных входных данных некоторые звуковые данные в конце потока будут удалены (даже если это более короткий поток). Чтобы кодирование файлов работало, необходимо добавить 5 секунд тишины для аудиовхода, чтобы один поток не заканчиваться за несколько секунд до другого. Типы потоков с прерывистыми выборками, такие как текстовые потоки или потоки изображений, не обязательно заполняться таким образом. Потоки команд скрипта также должны соответствовать всем этим правилам.

Интерфейс INSSBuffer

Интерфейс IWMWriter

Запись ФАЙЛОВ ASF