Написание примеров
[Функция, связанная с этой страницей, 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.
Чтобы передать пример писателю, выполните следующие действия.
- Выделите буфер и получите указатель на интерфейс INSSBuffer путем вызова IWMWriter::AllocateSample.
- Получите адрес буфера, созданного на шаге 1, путем вызова INSSBuffer::GetBuffer.
- Скопируйте образец данных в местоположение буфера, убедившись, что переданный образец поместится в выделенный буфер. Для копирования данных можно использовать любую функцию копирования памяти. Распространенный вариант — memcpy, который входит в стандартную библиотеку времени выполнения C.
- Обновите объем данных, используемых в буфере, чтобы отразить фактический размер образца, вызвав INSSBuffer::SetLength.
- Передайте интерфейс буфера записи вместе с входным номером и временем отсчета с помощью метода IWMWriter::WriteSample. Все аудиозаписи входных данных имеют одинаковую продолжительность, поэтому можно определить время сэмплов, добавляя длительность сэмпла к накопленной сумме. Для видео необходимо вычислить время на основе частоты кадров.
WriteSample работает асинхронно и может не завершить запись данных из буфера, прежде чем приложение будет готово к вызову метода еще раз. Поэтому важно вызывать AllocateSample один раз для каждого вызова WriteSample. Однако вы можете освободить интерфейс INSSBuffer сразу после вызова WriteSample.
После завершения передачи образцов вызовите IWMWriter::EndWriting.
Примечание Важно, чтобы образцы из всех потоков в файле передавались модулю записи в синхронизации друг с другом. Таким образом, каждый раз, когда это возможно, следует передавать образцы в порядке времени презентации в пределах допустимости синхронизации, указанной в IWMWriterAdvanced::SetSyncTolerance. Наилучшие результаты достигаются при доставке данных в каждый поток в единицах в секунду или меньше.
Потоки также должны заканчиваться примерно в то же время. Например, не следует записывать файл с аудиопотоком, который составляет 45 секунд и видеопоток, который составляет 50 секунд. Если вы кодируете такой файл с неуправляемыми входными данными, некоторые звуковые данные в конце потока будут удалены (даже если это более короткий поток). Чтобы кодирование файла работало, необходимо добавить 5 секунд молчания к аудиовходу, чтобы один поток не заканчивался раньше другого. Для типов потоков с прерывистыми образцами, такими как текстовые или графические потоки, не требуется заполнять их таким образом. Потоки команд скриптов также должны соответствовать всем этим правилам.
Связанные разделы