Media Foundation: Grundläggande begrepp
Om du är nybörjare på digitala medier introducerar det här avsnittet några begrepp som du måste förstå innan du skriver ett Media Foundation-program.
Strömmar
En ström är en sekvens av mediedata med en uniform typ. De vanligaste typerna är ljud och video, men en ström kan innehålla nästan alla typer av data, inklusive text, skriptkommandon och stillbilder. Termen dataström i den här dokumentationen innebär inte leverans via ett nätverk. En mediefil som är avsedd för lokal uppspelning innehåller också strömmar.
Vanligtvis innehåller en mediefil antingen en enda ljudström eller exakt en videoström och en ljudström. En mediefil kan dock innehålla flera strömmar av samma typ. En videofil kan till exempel innehålla ljudströmmar på flera olika språk. Vid körning väljer programmet vilken ström som ska användas.
Komprimering
Compression refererar till alla processer som minskar storleken på en dataström genom att ta bort redundant information. Komprimeringsalgoritmer delas in i två breda kategorier:
- Förlustfri komprimering. Med hjälp av en förlustfri algoritm är de rekonstruerade data identiska med originalet.
- Lossy komprimering. Med hjälp av en förlustalgoritm är rekonstruerade data en uppskattning av originalet, men är inte en exakt matchning.
I de flesta andra domäner är förlustkomprimering inte acceptabelt. (Tänk dig att få tillbaka en "uppskattning" av ett kalkylblad!) Men förlustkomprimeringsscheman är väl lämpade för ljud och video, av flera skäl.
Det första skälet har att göra med fysiken i människans uppfattning. När vi lyssnar på ett komplext ljud, som en musikinspelning, är en del av informationen i det ljudet inte märkbar för örat. Med hjälp av signalbehandlingsteori är det möjligt att analysera och separera de frekvenser som inte kan uppfattas. Dessa frekvenser kan tas bort utan perceptuell effekt. Även om det rekonstruerade ljudet inte matchar originalet exakt, kommer det att ljud på samma sätt som lyssnaren. Liknande principer gäller för video.
För det andra kan viss försämring av ljud- eller bildkvaliteten vara acceptabel, beroende på det avsedda syftet. I telefoni är till exempel ljud ofta mycket komprimerat. Resultatet är tillräckligt bra för ett telefonsamtal – men du vill inte lyssna på en symfoniorkester över en telefon.
Komprimering kallas också kodningoch en enhet som kodar kallas för en kodare. Den omvända processen är avkodning, och enheten är en naturligt kallad avkodare. Den allmänna termen för både kodare och avkodare är codec. Codecs kan implementeras i maskinvara eller programvara.
Komprimeringstekniken har förändrats snabbt sedan digitala medier och ett stort antal komprimeringsscheman används idag. Detta faktum är en av de största utmaningarna för programmering av digitala medier.
Mediabehållare
Det är ovanligt att lagra en rå ljud- eller videoström som en datorfil, eller att skicka en direkt via nätverket. För det första skulle det vara omöjligt att avkoda en sådan ström, utan att veta i förväg vilken codec som ska användas. Därför innehåller mediefiler vanligtvis minst några av följande element:
- Filhuvuden som beskriver antalet strömmar, formatet för varje ström och så vidare.
- Ett index som ger slumpmässig åtkomst till innehållet.
- Metadata som beskriver innehållet (till exempel artisten eller rubriken).
- Pakethuvuden för att aktivera nätverksöverföring eller slumpmässig åtkomst.
Den här dokumentationen använder termen container för att beskriva hela paketet med strömmar, huvuden, index, metadata och så vidare. Anledningen till att använda termen container i stället för fil är att vissa containerformat är utformade för livesändning. Ett program kan generera containern i realtid och aldrig lagra den i en fil.
Ett tidigt exempel på en mediecontainer är AVI-filformatet. Andra exempel är MP4 och Advanced Systems Format (ASF). Containrar kan identifieras med filnamnstillägget (till exempel .mp4) eller efter MIME-typ.
Följande diagram visar en typisk struktur för en mediecontainer. Diagrammet representerar inte något specifikt format. detaljerna i varje format varierar kraftigt.
Observera att strukturen som visas i diagrammet är hierarkisk, med rubrikinformation som visas i början av containern. Den här strukturen är typisk för många (men inte alla) containerformat. Observera också att dataavsnittet innehåller interfolierade ljud- och videopaket. Den här typen av interfoliering är vanlig i mediecontainrar.
Termen multiplexering refererar till processen att paketera ljud- och videoströmmarna och interfoliera paketen i containern. Den omvända processen, som återsamlar strömmarna från paketerade data, kallas demultiplexing.
Formater
I digitala medier är termen format tvetydig. Ett format kan referera till typen av kodning, till exempel H.264-video eller containern, till exempel MP4. Den här skillnaden är ofta förvirrande för vanliga användare. Namnen som ges till medieformat hjälper inte alltid. Till exempel refererar MP3- både till ett kodningsformat (MPEG-1 Audio Layer 3) och ett filformat.
Skillnaden är dock viktig, eftersom läsning av en mediefil faktiskt omfattar två steg:
- Först måste containern parsas. I de flesta fall kan inte antalet strömmar och formatet för varje ström vara kända förrän det här steget är klart.
- Om strömmarna komprimeras måste de sedan avkodas med lämpliga avkodare.
Detta faktum leder helt naturligt till en programvarudesign där separata komponenter används för att parsa containrar och avkoda strömmar. Dessutom lämpar sig den här metoden för en plugin-modell, så att tredje part kan tillhandahålla sina egna parsers och codecs. I Windows är komponentobjektmodellen (COM) ett standardsätt för att skilja ett API från implementeringen, vilket är ett krav för alla plugin-modeller. Därför (bland annat) använder Media Foundation COM-gränssnitt.
Följande diagram visar de komponenter som används för att läsa en mediefil:
Att skriva en mediefil kräver också två steg:
- Att koda okomprimerade ljud-/videodata.
- Placera komprimerade data i ett visst containerformat.
Följande diagram visar de komponenter som används för att skriva en mediefil:
Relaterade ämnen
-
programmeringsguide för Media Foundation