Delen via


De Window Media Codecs gebruiken in DirectShow

De Windows Media Audio- en Video-encoder- en decoderobjecten zijn oorspronkelijk ontworpen en geoptimaliseerd voor gebruik met de ASF-bestandsindeling en de Windows Media Format SDK. De codecobjecten werken goed in DirectShow voor bepaalde scenario's, namelijk enkelvoudige CBR- en kwaliteitsgebaseerde VBR-codering van videostreams. Maar als u overweegt de codec-objecten rechtstreeks in DirectShow te gebruiken met andere bestandscontainers dan ASF, zijn er bepaalde gedragingen en problemen die u van tevoren moet weten.

Notitie

Als u zelfstandige codecs wilt gebruiken met DirectShow, wilt u deze waarschijnlijk alleen gebruiken als DMO's. Met andere woorden, u gebruikt de IMediaObject interface in plaats van IMFTransform.

 

WM Audio in AVI-bestanden

U kunt DirectShow gebruiken om WMA-streams te coderen in elke bestandsindeling waarvoor u een multiplexer-filter hebt. De interfaces voor Windows Media Audio en Video-codecs bieden echter geen ondersteuning voor WMA in AVI-bestanden omdat het onmogelijk is, met behulp van de standaard DirectShow AVI-afspeelfilters, audio-videosynchronisatie in een AVI-bestand met een WMA-stream te behouden. Zie Gecomprimeerde media opslaan in AVI Filesvoor meer informatie.

De DMO van de audio-encoder levert voorbeelden van verschillende duur, zelfs wanneer deze zich in de modus 'constante bitsnelheid' bevindt. Het werkt daarom het beste met bestandscontainerindelingen die tijdstempels gebruiken. AVI-bestanden bieden geen tijdstempel voor elk audiovoorbeeld of elke groep voorbeelden. In DirectShow produceert het AVI Splitter-filter tijdstempels voor elke groep voorbeelden (elk audioframe) op basis van de nAvgBytesPerSec waarde in de WAVEFORMATEX structuur in de AVI-stroomkoptekst.

De aanname die aan deze berekening ten grondslag ligt, is dat alle audiosamples in de stream even lang zijn; de monsters die door de DMO worden uitgevoerd, zijn echter niet van gelijke duur en dus zijn de tijdstempels die door de AVI Splitter worden toegepast, niet nauwkeurig. Daarom is het niet mogelijk, zonder de AVI Splitter of de audio decoder DMO te wijzigen, om een DirectShow-gebaseerde toepassing te gebruiken om AVI-bestanden af te spelen met audio- en videostreams synchroon. De Windows Media Audio 9 Voice-codec werkt in sommige gevallen, maar zelfs dit verliest de synchronisatie na een zoekbewerking, zodat het echt niet als een haalbare oplossing kan worden beschouwd.

Als u een MP3-encoder hebt, kunt u AVI-bestanden maken met WMV en MP3 voor de audiostream. Dergelijke bestanden worden afgespeeld en correct gezocht in Windows Media Player en andere DirectShow-toepassingen, omdat de AVI Splitter speciale verwerkingscode voor MP3-streams bevat. Een andere optie is het gebruik van niet-gecomprimeerde PCM-audio, hoewel de resulterende bestandsgrootte veel groter is dan met een gecomprimeerde audiostream. Omdat de DirectShow-voorbeeldtoepassing AVI-bestanden maakt, wordt niet gedemonstreert hoe u de DMO van de audio-encoder gebruikt.

Codering met één wachtwoord

De video encoder DMO werkt eenvoudig in DirectShow voor twee coderingsmodi: CBR en op kwaliteit gebaseerde VBR. Zolang u de juiste volgorde van bewerkingen volgt bij het bouwen van de filtergrafiek, zoals gedemonstreerd in de voorbeeldtoepassing, is het relatief eenvoudig om WMV-inhoud in een AVI-bestand te plaatsen met behulp van de AVI Multiplexer en de File Writer.

Codering met twee pass-id's

De coderingsmodi met twee pass vereisen een complexere benadering voor het bouwen en streamen van grafieken om te voorkomen dat de DMO de inhoud van de eerste pas leegzet voordat de tweede pas wordt gestart. Bij codering in twee pass-coderingen is het nodig om de grafiek eenmaal uit te voeren, zodat de DMO de voorverwerkingsanalyse van de bestandsgegevens kan uitvoeren en vervolgens de grafiek terugspoelen en opnieuw uitvoeren, zodat de DMO de werkelijke codering kan uitvoeren.

Wanneer de grafiek een uitvoeringsstatus voor de tweede pas krijgt, stelt de DMO Wrapper de vlag DISCONTINUITY in op het eerste voorbeeld, omdat de tijdstempel niet opeenvolgend is met de laatste tijdstempel op de eerste pas. Wanneer de DMO, die niet is ontworpen om op deze manier in DirectShow te werken, de DISCONTINUITY-vlag ontvangt, voert het een flush uit en verliest het de gegevens die tijdens de eerste doorgang zijn opgeslagen. Om dit probleem te omzeilen, is de beste oplossing waarschijnlijk om een aangepast DMO Wrapper-filter te schrijven dat de vlag DISCONTINUITY niet instelt wanneer de grafiek na de eerste pas wordt gezocht. Het voorbeeld video voor Windows (VfW) in deze SDK laat zien hoe u codering met twee pass-bewerkingen uitvoert.

Geïnterlinieerde inhoud

De WMV-encoder DMO kan interlaced video-inhoud coderen terwijl de interlacing behouden blijft, wat nuttig is voor inhoud die is vastgelegd vanaf een tv, en die ook kan worden afgespeeld op een tv. Het is echter niet mogelijk om interliniëring te behouden met de standaard DMO Wrapper, omdat dat filter namelijk geen ondersteuning biedt voor INSSBuffer op de invoermonsters.

De DMO gebruikt die interface om de interlaced instellingen te verkrijgen voor elk ontvangen voorbeeld. Als de interface niet wordt gevonden, zoals het geval is met de DMO Wrapper, behandelt de DMO de invoervoorbeelden gewoon als niet-geïnterlaceerd. Voor het uitvoeren van interlaced codering in DirectShow zijn er verschillende alternatieven. De eenvoudigste methode is waarschijnlijk om de Windows Media Format 9 Series SDK rechtstreeks te gebruiken of het WM ASF Writer DirectShow-filter te gebruiken om een interlaced ASF-bestand te maken. Vervolgens kunt u dat bestand transcoderen in een andere indeling. Als je transcodeert naar AVI, heb je een geïnterlaced bestand, maar de standaard DirectShow AVI afspeelfilters zullen het niet als zodanig herkennen omdat ze geen ondersteuning bieden voor VIDEOINFOHEADER2. Een andere methode is het schrijven van uw eigen DMO Wrapper-filter dat ondersteuning biedt voor de INSSBuffer interface.

Werken met DMOs van codecs