Sdílet prostřednictvím


Vytvoření souborů ASF pomocí kodeků třetích stran

[Funkce přidružená k této stránce, Windows Media Format 11 SDK, je starší funkce. Byla nahrazena čtečkou zdroje a zapisovačem úložiště . Čtečka zdroje a zapisovač jímky jsou optimalizovány pro Windows 10 a Windows 11. Microsoft důrazně doporučuje, aby nový kód používal čtečku zdroje a zapisovač jímky místo Windows Media Format 11 SDK, pokud je to možné. Microsoft navrhuje, aby se stávající kód, který používá starší rozhraní API, přepsal, aby se nová rozhraní API používala, pokud je to možné.]

Sadu WINDOWS Media Format SDK můžete použít k vytvoření souborů ASF, které obsahují digitální médium kódované libovolným kodekem. Při použití jiného kodeku, než který je součástí této sady SDK, je nutné provést následující kroky.

  1. Zakódujte obsah požadovaným kodekem.
  2. Vyhledejte nebo vytvořte hodnotu GUID pro identifikaci obsahu zakódovaného pomocí kodeku použitého v kroku 1.
  3. Vytvořte nový profil nebo upravte existující profil pro použití s kódovaným obsahem.
    • Vytvořte datový proud pro kódovaný obsah s odpovídajícím hlavním typem. Další informace o hlavních typech médií naleznete v tématu Typy médií. Jako podtyp média použijte identifikátor GUID identifikovaný v kroku 2.
    • Nastavte bitovou rychlost a okno vyrovnávací paměti datového proudu na hodnoty, které nebudou mít za následek přetečení vyrovnávací paměti. Tyto hodnoty byste měli být schopni získat z kodeku v době kódování. Komponenty modulu runtime sady SDK zkontrolují hodnoty intervalu přenosové rychlosti nebo vyrovnávací paměti a v případě potřeby odstraňují vzorky, aby se daná data vešel do těchto hodnot. Pokud hodnoty nastavíte nesprávně, soubor nebude správně streamovat, což vede k špatnému přehrávání.
    • U video streamů je nutné nastavit biCompression člen BITMAPINFOHEADER strukturu obsaženou v WMVIDEOINFOHEADER strukturu odpovídající FOURCC pro obsah. Tato hodnota musí být rovna prvním čtyřem bajtům identifikátoru GUID podtypu. Pokud je například biCompression MAKEFOURCC('T','E','S','T')=0x54455354, začne identifikátor GUID podtypu takto: 54455354-XXXX-XXXX-XXXX-XXXXXXXXXXXX.
  4. Vytvořte objekt zapisovače a načtěte profil vytvořený v předchozím kroku. Další informace o zápisu souborů naleznete v tématu Zápis souborů ASF.
  5. Projděte vstupy souboru a přiřaďte vstupní vlastnosti pro každý z nich obvyklým způsobem. Další informace o vstupech naleznete v tématu Práce se vstupy. Pro datový proud kódovaný pomocí kodeku třetí strany nastavte ukazatel rozhraní IWMInputMediaProps na NULL před voláním IWMWriter::BeginWriting.
  6. K zápisu souboru použijte nový profil vytvořený v předchozím kroku. Předejte komprimované ukázky pomocí IWMWriterAdvanced::WriteStreamSample místo IWMWriter::WriteSample. U videa musíte určit, které vzorky představují klíčové snímky předáním WM_SF_CLEANPOINT jako parametru dwFlags.

Pokud chcete zpracovat a dekomprimovat stream kódovaný pomocí kodekem třetí strany, musíte číst komprimované vzorky streamů. Vaše aplikace pro čtení musí zpracovávat také ukázkovou dekompresi datového proudu.

Vložení streamů MPEG-2 do ASF

Poznámka

Toto téma se týká aplikací, které používají sadu Windows Media Format SDK k vložení MPEG-2 (nebo jiných formátů komprese, které používají rámce B) do kontejneru souborů ASF.

 

Objekt zapisovače vyžaduje, aby všechny vstupní vzorky měly časové razítko a předpokládá, že každý vstupní vzorek má čas prezentace později než ten, který mu předchází. I když prakticky všechna nekomprimovaná videa a dokonce i některé komprimované video streamy splňují tyto podmínky, streamy MPEG-2 ne. V MPEG-2 nejsou všechny vzorky opatřeny časovým razítkem a v případě, že jsou přítomny snímky typu B, není pořadí dekódování vzorku stejné jako pořadí vykreslování. Když objekt zapisovače narazí na vzorky mimo pořadí, přeuspořádá je do "správného" pořadí. Proto pokud chcete nativně ukládat streamy MPEG-2 (ne dekódované) v kontejneru ASF, musíte provést následující kroky:

Při zápisu souboru:

  1. Přidejte ke každé vstupní ukázce rozšíření datové jednotky s pevnou velikostí (DUE), které bude obsahovat strukturu se skutečnými časovými razítky MPEG, tedy hodnoty začátku a konce pro ukázku. Pro tyto hodnoty použijte -1, pokud ukázka nemá časové razítko.
  2. Dejte objektu zapisovače "fiktivní" vstupní časová razítka, která se neustále zvyšují, aby se vzorky zapisují do souboru ve stejném pořadí, v jakém byly přijaty. Fiktivní časová razítka by měla odpovídat přibližně skutečným časům prezentace podle průměru v průběhu času. Fiktivní časová razítka budou tvořit hledanou časovou osu, takže pokud se liší vzhledem k razítkům v reálném čase, operace hledání v souboru způsobí neočekávané výsledky. Omezené množství chvění mezi vzorkovacími časy však vážně neovlivní operace hledání.

Při čtení souboru:

  • Pro každou ukázku načtenou ze souboru zkontrolujte DUE. Pokud obsahuje počáteční čas, který je větší nebo roven nule, zkopírujte tuto hodnotu do časového razítka pro výstupní ukázku před doručením do dekodéru. Nastavte všechna ostatní časová razítka u výstupních ukázek tak, aby NULL. V DirectShow se to provádí voláním IMediaSample::SetTime(NULL,NULL).

ukládání obsahu do vyrovnávací paměti

rozhraní IWMWriter

IWMWriterAdvanced – rozhraní

pro doručení komprimovaných ukázek pomocí asynchronní čtečky

Načtení vzorků datových proudů pomocí synchronního čtecího zařízení

WMVIDEOINFOHEADER

Práce s profily

psaní souborů ASF