Чтение файлов с помощью синхронного средства чтения

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

Синхронное средство чтения можно использовать для чтения ASF-файла с помощью синхронных вызовов вместо асинхронных методов в объекте средства чтения. Использование синхронных вызовов сокращает количество потоков, необходимых для чтения файла. Асинхронное средство чтения использует несколько потоков для обработки потоков. Для файлов с несколькими потоками количество используемых потоков может стать очень большим. Синхронное средство чтения использует только один поток.

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

Синхронное средство чтения может открывать локальные файлы или файлы в сети, используя имя UNC-пути (например, \\someshare\somedirectory\somefile.wmv). Невозможно выполнять потоковую передачу файлов в синхронное средство чтения или открывать файлы из интернета. Синхронное средство чтения также обеспечивает поддержку использования com-интерфейса IStream в качестве источника.

Синхронное средство чтения обеспечивает большую универсальность для получения примеров из ASF-файла, чем асинхронное средство чтения. Синхронное средство чтения может доставлять примеры как по номеру потока, так и по выходным данным. Примеры, доставляемые по номеру потока, могут быть сжаты или несжаты. Синхронное средство чтения также может переключаться между сжатой и несжатой доставкой во время воспроизведения; Эта функция называется "быстрое редактирование". Эта функция позволяет приложению редактирования считывать содержимое на основе Windows Media и передавать его непосредственно модулю записи, пока не будет достигнут нужный кадр. На этом этапе приложение может сообщить средству чтения начать доставку несжатого содержимого, которое затем приложение может изменить и передать модулю записи для повторной сжатия. Когда приложение завершит изменение указанных кадров, оно может сообщить средству чтения начать доставку сжатых кадров снова.

Основные функциональные возможности синхронного объекта средства чтения можно разбить на следующие шаги. На этих шагах "приложение" относится к программе, написанной с помощью пакета SDK для формата Windows Media.

  1. Приложение передает синхронному средству чтения имя считываемого файла. Когда синхронное средство чтения открывает файл, оно присваивает каждому потоку выходной номер. Если файл использует взаимное исключение, средство чтения назначает один выход для всех взаимоисключающих потоков.
  2. Приложение получает сведения о конфигурации различных выходных данных от средства чтения. Собранные сведения позволят приложению правильно отображать примеры мультимедиа.
  3. Приложение начинает запрашивать примеры по одному из синхронного средства чтения. Синхронное средство чтения доставляет каждый образец в объект буфера, для которого предоставляется интерфейс INSSBuffer .
  4. Приложение отвечает за отрисовку данных после их доставки средством чтения. Пакет SDK для форматов Windows Media не предоставляет процедуры отрисовки. Как правило, приложения используют другие пакеты SDK для отрисовки данных, например пакет SDK Microsoft Direct X или мультимедийные функции Windows Platform SDK Майкрософт.

Эти шаги показаны в примере приложения WMSyncReader. Дополнительные сведения см. в разделе Примеры приложений.

Синхронное средство чтения также поддерживает более расширенные функциональные возможности. Синхронное средство чтения позволяет выполнять следующие действия:

  • Укажите диапазон выборок для получения по времени или номеру кадра.
  • Выбор потока управления для взаимоисключающих потоков.
  • Откройте файл с помощью стандартного ИНТЕРФЕЙСА COM IStream.
  • Чтение данных профиля из заголовка файла.
  • Чтение метаданных из заголовка файла.
  • Переключение между примерами потоковой и выходной во время воспроизведения.
  • Переключение между сжатыми и несжатыми примерами потоков во время воспроизведения.

В следующих разделах подробно описывается использование объекта синхронного средства чтения.

Пример кода

В следующем примере кода показано, как считывать примеры из ASF-файла с помощью синхронного средства чтения. Он определяет по номеру кадра диапазон доставляемых выборок.

IWMSyncReader* pSyncReader = NULL;
INSSBuffer*    pMyBuffer   = NULL;

QWORD cnsSampleTime = 0;
QWORD cnsSampleDuration = 0;
DWORD dwFlags = 0;
DWORD dwOutputNumber;
HRESULT hr = S_OK;

// Initialize COM.
hr = CoInitialize(NULL);

// Create a synchronous reader.
hr = WMCreateSyncReader(NULL, WMT_RIGHT_PLAYBACK, &pSyncReader);

// Open an ASF file.
hr = pSyncReader->Open(L"c:\\somefile.wmv");

// TODO: Identify the properties for each output. This works 
// exactly as it does with the asynchronous reader.

// Specify a playback range from frame number 100 of the video 
// stream to the end of the file. Assume that the video stream 
// is stream number 2.
hr = pSyncReader->SetRangeByFrame(2, 100, 0);

// Loop through all the samples in the specified range.
do
{
   // Get the next sample, regardless of its stream number.
   hr = pSyncReader->GetNextSample(0,
                                   &pMyBuffer,
                                   &cnsSampleTime,
                                   &cnsSampleDuration,
                                   &dwFlags,
                                   &dwOutputNumber,
                                   NULL);

   if(SUCCEEDED(hr))
   {
      // TODO: Process the sample in whatever way is appropriate 
      // to your application. When finished, clean up.
      pMyBuffer->Release();
      pMyBuffer = NULL;
      cnsSampleTime     = 0;
      cnsSampleDuration = 0;
      dwFlags           = 0;
      dwOutputNumber    = 0;
   }
} 
while (SUCCEEDED(hr));

pSyncReader->Release();
pSyncReader = NULL;

Интерфейс IWMSyncReader

Чтение ФАЙЛОВ ASF

Объект модуля синхронного чтения