Udostępnij przez


Odczytywanie plików za pomocą czytnika synchronicznego

[Funkcja skojarzona z tą stroną, windows Media Format 11 SDK, jest starszą funkcją. Został zastąpiony przez Source Reader i Sink Writer. Czytnik źródła oraz zapisator ujścia zostały zoptymalizowane pod kątem systemów Windows 10 i Windows 11. Firma Microsoft zdecydowanie zaleca, aby nowy kod używał Source Reader i Sink Writer zamiast Windows Media Format 11 SDK, jeśli jest to możliwe. Firma Microsoft sugeruje, że istniejący kod, który używa starszych interfejsów API, należy przepisać go do korzystania z nowych interfejsów API, jeśli to możliwe.]

Za pomocą czytnika synchronicznego można odczytać plik ASF przy użyciu wywołań synchronicznych zamiast metod asynchronicznych w obiekcie czytnika. Użycie wywołań synchronicznych zmniejsza liczbę wątków wymaganych do odczytu pliku. Czytnik asynchroniczny używa wielu wątków do przetwarzania strumieni. W przypadku plików z wieloma strumieniami liczba używanych wątków może stać się bardzo duża. Czytnik synchroniczny używa tylko jednego wątku.

Czytnik synchroniczny został zaprojektowany tak, aby spełniał potrzeby tworzenia zawartości i edytowania plików. Można użyć czytnika synchronicznego dla innych aplikacji, ale jej funkcjonalność jest ograniczona.

Synchroniczny czytnik może otwierać pliki lokalne lub pliki w sieci przy użyciu nazwy ścieżki UNC (na przykład "\\someshare\somedirectory\somefile.wmv"). Nie można przesyłać strumieniowo plików do synchronicznego czytnika ani otwierać plików z lokalizacji internetowej. Czytnik synchroniczny umożliwia również użycie interfejsu IStream IStream COM jako źródła.

Czytnik synchroniczny zapewnia bardziej wszechstronność pobierania próbek z pliku ASF niż czytnik asynchroniczny. Czytnik synchroniczny może dostarczać próbki według numeru strumienia oraz według wyjścia. Przykłady dostarczane przez numer strumienia mogą być kompresowane lub nieskompresowane. Czytnik synchroniczny może również przełączać się między skompresowanym a nieskompresowanym trybem dostarczania podczas odtwarzania; ta funkcja jest znana jako "szybka edycja". Ta funkcja umożliwia aplikacji do edycji odczytywanie zawartości oferowanej przez Windows Media i przekazywanie jej bezpośrednio do składnika zapisywania do momentu osiągnięcia żądanej klatki. W tym momencie aplikacja może poinformować czytelnika o rozpoczęciu dostarczania nieskompresowanej zawartości, którą aplikacja może następnie zmodyfikować i przekazać do modułu zapisywania w celu ponownego skompresowania. Po zakończeniu modyfikowania określonych ramek aplikacja może poinformować czytelnika, że można wznowić dostarczanie skompresowanych ramek.

Najbardziej podstawowe funkcje obiektu czytnika synchronicznego można podzielić na następujące kroki. W tych krokach "aplikacja" odnosi się do programu, który piszesz przy użyciu zestawu WINDOWS Media Format SDK.

  1. Aplikacja przekazuje do synchronicznego czytnika nazwę pliku do odczytania. Po otwarciu pliku przez synchroniczny czytnik przypisuje numer wyjściowy do każdego strumienia. Jeśli plik używa wzajemnego wykluczenia, czytelnik przypisuje pojedyncze dane wyjściowe dla wszystkich wzajemnie wykluczających się strumieni.
  2. Aplikacja pobiera informacje o konfiguracji różnych danych wyjściowych z czytnika. Zebrane informacje umożliwią aplikacji prawidłowe renderowanie przykładów multimediów.
  3. Aplikacja zaczyna pobierać próbki pojedynczo od synchronicznego czytnika. Czytnik synchroniczny dostarcza każdą próbkę w obiekcie buforowym, dla którego dostępny jest interfejs INSSBuffer.
  4. Aplikacja jest odpowiedzialna za renderowanie danych po ich dostarczeniu przez czytelnika. Zestaw WINDOWS Media Format SDK nie udostępnia żadnych procedur renderowania. Zazwyczaj aplikacje będą używać innych zestawów SDK do renderowania danych, takich jak zestaw Microsoft Direct X SDK, lub funkcji multimedialnych zestawu Microsoft Windows Platform SDK.

Te kroki przedstawiono w przykładowej aplikacji WMSyncReader. Aby uzyskać więcej informacji, zobacz Przykładowe Aplikacje.

Czytnik synchroniczny obsługuje również bardziej zaawansowane funkcje. Czytnik synchroniczny umożliwia wykonanie następujących czynności:

  • Określ zakres próbek do pobrania według czasu lub liczby ramek.
  • Zarządzaj wyborem wzajemnie wykluczających się strumieni.
  • Otwórz plik przy użyciu standardowego interfejsu COM, IStream.
  • Odczytywanie danych profilu z nagłówka pliku.
  • Odczytywanie metadanych z nagłówka pliku.
  • Przełącz między próbkami strumienia i wyjścia podczas odtwarzania.
  • Przełączanie między skompresowanych i nieskompresowanych próbek strumieni podczas odtwarzania.

W poniższych sekcjach opisano szczegółowo użycie obiektu czytnika synchronicznego.

przykładowy kod

Poniższy przykładowy kod pokazuje, jak odczytywać przykłady z pliku ASF przy użyciu czytnika synchronicznego. Określa według liczby ramek zakres próbek do dostarczenia.

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;

Interfejs IWMSyncReader

odczytywanie plików ASF

Obiekt synchronicznego czytnika