Voorbeelden schrijven
[De functie die is gekoppeld aan deze pagina, Windows Media Format 11 SDK, is een verouderde functie. Het is vervangen door Source Reader en Sink Writer. Bronlezer en Sink Writer zijn geoptimaliseerd voor Windows 10 en Windows 11. Microsoft raadt ten zeerste aan om nieuwe code te gebruiken bronlezer en Sink Writer- in plaats van Windows Media Format 11 SDK, indien mogelijk. Microsoft stelt voor dat bestaande code die gebruikmaakt van de verouderde API's, indien mogelijk opnieuw worden geschreven om de nieuwe API's te gebruiken.]
Wanneer u de invoer hebt geïdentificeerd en geconfigureerd voor het bestand dat u schrijft, kunt u beginnen met het doorgeven van voorbeelden aan de schrijver. U moet indien mogelijk voorbeelden doorgeven in de volgorde van presentatietijd om het schrijfproces efficiënter te maken.
Voordat u voorbeelden doorgeeft, moet u de schrijver instellen om ze te accepteren door IWMWriter::BeginWritingaan te roepen.
Voer de volgende stappen uit om een voorbeeld door te geven aan de schrijver:
- Wijs een buffer toe en haal een aanwijzer op naar de INSSBuffer-interface door IWMWriter::AllocateSample-aan te roepen.
- Haal het adres op van de buffer die in stap 1 is gemaakt door INSSBuffer::GetBufferaan te roepen.
- Kopieer de voorbeeldgegevens naar de bufferlocatie en zorg ervoor dat het doorgegeven voorbeeld in de toegewezen buffer past. U kunt elke functie voor het kopiëren van geheugen gebruiken om uw gegevens te kopiëren. Een veelvoorkomende keuze is memcpy, die is opgenomen in de standaard C-runtimebibliotheek.
- Werk de hoeveelheid gegevens bij die in de buffer worden gebruikt om de werkelijke grootte van het voorbeeld weer te geven door INSSBuffer::SetLength-aan te roepen.
- Geef de bufferinterface door aan de schrijver, samen met het invoernummer en de voorbeeldtijd met behulp van de methode IWMWriter::WriteSample. Alle audiovoorbeelden voor een invoer vertegenwoordigen dezelfde duur van de inhoud, zodat u de voorbeeldtijd kunt berekenen door de duur van het voorbeeld toe te voegen aan een voorlopig totaal. Voor video moet u de tijd berekenen op basis van de framesnelheid.
WriteSample- asynchroon werkt en kan het schrijven van de gegevens uit de buffer mogelijk niet voltooien voordat de toepassing klaar is om de methode opnieuw aan te roepen. Daarom is het belangrijk om AllocateSample- eenmaal aan te roepen voor elke aanroep naar WriteSample-. U kunt de INSSBuffer-interface echter onmiddellijk vrijgeven nadat u WriteSample-hebt aangeroepen.
Wanneer u klaar bent met het doorgeven van voorbeelden, roept u IWMWriter::EndWritingaan.
Opmerking Het is belangrijk dat voorbeelden van alle streams in het bestand worden doorgegeven aan de schrijver in synchronisatie met elkaar. Indien mogelijk moet u voorbeelden doorgeven aan de schrijver in de volgorde van presentatietijd binnen de synchronisatietolerantie die is opgegeven in IWMWriterAdvanced::SetSyncTolerance. De beste resultaten worden bereikt wanneer gegevens in eenheden van één seconde of minder aan elke stroom worden geleverd.
Streams moeten ook ongeveer op hetzelfde moment eindigen. U moet bijvoorbeeld geen bestand schrijven met een audiostream die 45 seconden lang is en een videostream die 50 seconden lang is. Als u een dergelijk bestand codeert met ongewijzigde invoer, worden sommige audiogegevens aan het einde van de stream weggelaten (ook al is het de kortere stroom). Als u de bestandscodering wilt laten werken, moet u 5 seconden stilte toevoegen aan de audio-invoer, zodat de ene stream niet meerdere seconden voor een andere stream eindigt. Het is niet nodig dat stroomtypen met intermitterende voorbeelden, zoals tekst- of afbeeldingsstromen, op deze manier worden aangevuld. Scriptopdrachtstromen moeten ook al deze regels volgen.
Verwante onderwerpen