Delen via


Media Foundation: Essentiële concepten

Als u geen kennis hebt met digitale media, introduceert dit onderwerp enkele concepten die u moet begrijpen voordat u een Media Foundation-toepassing schrijft.

Stromen

Een stream is een reeks mediagegevens met een uniform type. De meest voorkomende typen zijn audio en video, maar een stream kan vrijwel elk soort gegevens bevatten, waaronder tekst, scriptopdrachten en nog steeds afbeeldingen. De term stream in deze documentatie impliceert geen levering via een netwerk. Een mediabestand dat is bedoeld voor lokaal afspelen, bevat ook streams.

Normaal gesproken bevat een mediabestand één audiostream of precies één videostream en één audiostream. Een mediabestand kan echter verschillende streams van hetzelfde type bevatten. Een videobestand kan bijvoorbeeld audiostreams bevatten in verschillende talen. Tijdens runtime selecteert de toepassing welke stream moet worden gebruikt.

Compressie

Compressie verwijst naar elk proces dat de grootte van een gegevensstroom vermindert door redundante informatie te verwijderen. Compressiealgoritmen worden onderverdeeld in twee algemene categorieën:

  • Lossless compressie. Met behulp van een algoritme zonder verlies is de gereconstrueerde gegevens identiek aan het origineel.
  • Verlieslatende compressie. Met behulp van een verlies-algoritme zijn de gereconstrueerde gegevens een benadering van het origineel, maar niet een exacte overeenkomst.

In de meeste andere domeinen is verliescompressie niet acceptabel. (Stel dat u een 'benadering' van een spreadsheet terugkrijgt!) Maar lossy compressieschema's zijn om een paar redenen geschikt voor audio en video.

De eerste reden heeft te maken met de fysica van menselijke perceptie. Wanneer we naar een complex geluid luisteren, zoals een muziekopname, is een deel van de informatie in dat geluid niet waarneembaar voor het oor. Met behulp van signaalverwerkingstheorie is het mogelijk om de frequenties te analyseren en te scheiden die niet kunnen worden waargenomen. Deze frequenties kunnen zonder perceptueel effect worden verwijderd. Hoewel de gereconstrueerde audio niet exact overeenkomt met het origineel, het geluid hetzelfde als de listener. Vergelijkbare principes zijn van toepassing op video.

Ten tweede kan enige afname van de geluids- of afbeeldingskwaliteit acceptabel zijn, afhankelijk van het beoogde doel. In telefonie wordt audio bijvoorbeeld vaak sterk gecomprimeerd. Het resultaat is goed genoeg voor een telefoongesprek, maar u wilt niet luisteren naar een symfonisch orkest via een telefoon.

Compressie wordt ook wel coderings-genoemd en een apparaat dat codeert, wordt een encodergenoemd. Het omgekeerde proces is decoderingen het apparaat wordt natuurlijk een decodergenoemd. De algemene term voor zowel encoders als decoders is codec. Codecs kunnen worden geïmplementeerd in hardware of software.

De compressietechnologie is snel veranderd sinds de komst van digitale media en een groot aantal compressieschema's wordt tegenwoordig gebruikt. Dit feit is een van de belangrijkste uitdagingen voor programmeren van digitale media.

Mediacontainers

Het is zeldzaam om een onbewerkte audio- of videostream op te slaan als een computerbestand of om er een rechtstreeks via het netwerk te verzenden. Voor één ding zou het onmogelijk zijn om een dergelijke stream te decoderen, zonder vooraf te weten welke codec moet worden gebruikt. Mediabestanden bevatten daarom meestal ten minste enkele van de volgende elementen:

  • Bestandsheaders die het aantal streams beschrijven, de indeling van elke stream, enzovoort.
  • Een index die willekeurige toegang tot de inhoud mogelijk maakt.
  • Metagegevens die de inhoud beschrijven (bijvoorbeeld de kunstenaar of titel).
  • Pakketheaders, om netwerkoverdracht of willekeurige toegang in te schakelen.

In deze documentatie wordt de term container gebruikt om het hele pakket streams, headers, indexen, metagegevens enzovoort te beschrijven. De reden voor het gebruik van de term container in plaats van bestand is dat sommige containerindelingen zijn ontworpen voor live broadcast. Een toepassing kan de container in realtime genereren en deze nooit opslaan in een bestand.

Een vroeg voorbeeld van een mediacontainer is de AVI-bestandsindeling. Andere voorbeelden zijn MP4 en Advanced Systems Format (ASF). Containers kunnen worden geïdentificeerd met de bestandsnaamextensie (bijvoorbeeld .mp4) of per MIME-type.

In het volgende diagram ziet u een typische structuur voor een mediacontainer. Het diagram vertegenwoordigt geen specifieke indeling; de details van elke indeling variëren sterk.

diagram met een typische mediacontainer

U ziet dat de structuur die in het diagram wordt weergegeven hiërarchisch is, waarbij koptekstinformatie wordt weergegeven aan het begin van de container. Deze structuur is typisch voor veel (maar niet alle) containerindelingen. Merk ook op dat de datasectie interleaved audio- en videopakketten bevat. Dit type tussentijdse invoeging is gebruikelijk in mediacontainers.

De term multiplexing verwijst naar het proces van het verpakken van de audio- en videostreams en het afwisselend samenvoegen van de pakketten in de container. Het omgekeerde proces, het opnieuw samenstellen van de stromen uit de gepaketteerde gegevens, wordt demultiplexinggenoemd.

Formaten

In digitale media is de term indeling vaag. Een indeling kan verwijzen naar het type codering, zoals H.264-video, of de container, zoals MP4. Dit onderscheid is vaak verwarrend voor gewone gebruikers. De namen die aan media-indelingen worden gegeven, helpen niet altijd. MP3- verwijst bijvoorbeeld zowel naar een coderingsindeling (MPEG-1 Audio Layer 3) als een bestandsindeling.

Het onderscheid is echter belangrijk, omdat het lezen van een mediabestand eigenlijk twee fasen omvat:

  1. Eerst moet de container worden geparseerd. In de meeste gevallen kan het aantal streams en de indeling van elke stream pas bekend zijn als deze stap is voltooid.
  2. Als de streams vervolgens worden gecomprimeerd, moeten ze worden gedecodeerd met behulp van de juiste decoders.

Dit feit leidt vrij natuurlijk tot een softwareontwerp waarbij afzonderlijke onderdelen worden gebruikt om containers te parseren en streams te decoderen. Verder is deze benadering geschikt voor een invoegtoepassingsmodel, zodat derden hun eigen parsers en codecs kunnen leveren. In Windows biedt het Component Object Model (COM) een standaardmethode om een API te scheiden van de implementatie. Dit is een vereiste voor elk invoegtoepassingsmodel. Om deze reden (onder andere) maakt Media Foundation gebruik van COM-interfaces.

In het volgende diagram ziet u de onderdelen die worden gebruikt om een mediabestand te lezen:

diagram met de onderdelen voor het lezen van een mediabestand

Voor het schrijven van een mediabestand zijn ook twee stappen vereist:

  1. De niet-gecomprimeerde audio-/videogegevens coderen.
  2. De gecomprimeerde gegevens in een bepaalde containerindeling plaatsen.

In het volgende diagram ziet u de onderdelen die worden gebruikt om een mediabestand te schrijven:

diagram met de onderdelen voor het schrijven van een mediabestand.

Programmeerhandleiding voor Media Foundation