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


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

[Функция, связанная с этой страницей, Windows Media Format 11 SDK, это устаревшая функция. Он был заменен средством Source Reader и средством Sink Writer . средства чтения источников и записи приемника оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует по возможности использовать компонент Source Reader и компонент Sink Writer вместо пакета Windows Media Format 11 SDK. Корпорация Майкрософт предлагает, что существующий код, использующий устаревшие 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