Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
In dit artikel leest u hoe u een MediaFrameReader met MediaCapture gebruikt om audiogegevens op te halen uit een mediaframebron. Zie Mediaframes verwerken met MediaFrameReader voor meer informatie over het gebruik van een MediaFrameReader om afbeeldingsgegevens op te halen, bijvoorbeeld van een kleuren-, infrarood- of dieptecamera. Dit artikel bevat een algemeen overzicht van het gebruikspatroon van de framelezer en bespreekt enkele aanvullende functies van de MediaFrameReader-klasse , zoals het gebruik van MediaFrameSourceGroup om frames uit meerdere bronnen tegelijk op te halen.
Opmerking
De functies die in dit artikel worden besproken, zijn alleen beschikbaar vanaf Windows 10 versie 1803.
Uw project instellen
Het proces voor het verkrijgen van audioframes is grotendeels hetzelfde als het verkrijgen van andere typen mediaframes. Net als bij elke app die gebruikmaakt van MediaCapture, moet u aangeven dat uw app de webcammogelijkheid gebruikt voordat u toegang probeert te krijgen tot een cameraapparaat. Als uw app wordt vastgelegd vanaf een audioapparaat, moet u ook de mogelijkheid van het microfoonapparaat declareren.
Framebronnen en framebrongroepen selecteren
De eerste stap bij het vastleggen van audioframes is het initialiseren van een MediaFrameSource die de bron van de audiogegevens vertegenwoordigt, zoals een microfoon of een ander audio-opnameapparaat. Hiervoor moet u een nieuw exemplaar van het MediaCapture-object maken. In dit voorbeeld is de enige initialisatie-instelling voor MediaCapture het instellen van streamingcapturemode om aan te geven dat we audio van het opnameapparaat willen streamen.
Nadat u MediaCapture.InitializeAsync hebt aangeroepen, kunt u de lijst met toegankelijke mediaframebronnen ophalen met de eigenschap FrameSources . In dit voorbeeld worden alle framebronnen geselecteerd waarin MediaFrameSourceInfo die de framebron beschrijft, een MediaStreamType of Audio heeft, waarmee wordt aangegeven dat de mediabron audiogegevens produceert.
Als de query een of meer framebronnen retourneert, kunt u de eigenschap CurrentFormat controleren om te zien of de bron de gewenste audio-indeling ondersteunt. In dit voorbeeld zwevende audiogegevens. Controleer de AudioEncodingProperties om ervoor te zorgen dat de gewenste audiocodering wordt ondersteund door de bron.
m_mediaCapture = new MediaCapture();
MediaCaptureInitializationSettings settings = new MediaCaptureInitializationSettings()
{
StreamingCaptureMode = StreamingCaptureMode.Audio,
};
await m_mediaCapture.InitializeAsync(settings);
var audioFrameSources = m_mediaCapture.FrameSources.Where(x => x.Value.Info.MediaStreamType == MediaStreamType.Audio);
if (audioFrameSources.Count() == 0)
{
Debug.WriteLine("No audio frame source was found.");
return;
}
MediaFrameSource frameSource = audioFrameSources.FirstOrDefault().Value;
MediaFrameFormat format = frameSource.CurrentFormat;
if (format.Subtype != MediaEncodingSubtypes.Float)
{
return;
}
if (format.AudioEncodingProperties.ChannelCount != 2
|| format.AudioEncodingProperties.SampleRate != 48000)
{
return;
}
MediaFrameReader maken en starten
Haal een nieuw exemplaar van MediaFrameReader op door MediaCapture.CreateFrameReaderAsync aan te roepen en het MediaFrameSource-object door te geven dat u in de vorige stap hebt geselecteerd. Standaard worden audioframes in de buffermodus verkregen, waardoor het minder waarschijnlijk is dat frames worden verwijderd, hoewel dit nog steeds kan gebeuren als u audioframes niet snel genoeg verwerkt en de getoevoegde geheugenbuffer van het systeem vult.
Registreer een handler voor de MediaFrameReader.FrameArrived-gebeurtenis , die door het systeem wordt gegenereerd wanneer er een nieuw frame met audiogegevens beschikbaar is. Roep StartAsync aan om de acquisitie van audioframes te starten. Als de framelezer niet kan worden gestart, heeft de statuswaarde die door de aanroep wordt geretourneerd een andere waarde dan Geslaagd.
m_mediaFrameReader = await m_mediaCapture.CreateFrameReaderAsync(frameSource);
// Optionally set acquisition mode. Buffered is the default mode for audio.
m_mediaFrameReader.AcquisitionMode = MediaFrameReaderAcquisitionMode.Buffered;
m_mediaFrameReader.FrameArrived += MediaFrameReader_AudioFrameArrived;
var status = await m_mediaFrameReader.StartAsync();
if (status != MediaFrameReaderStartStatus.Success)
{
Debug.WriteLine("The MediaFrameReader couldn't start.");
}
Roep in de FrameArrived-gebeurtenishandler de methode TryAcquireLatestFrame aan op het MediaFrameReader-object dat als afzender aan de handler is doorgegeven, om te proberen een verwijzing naar het meest recente mediaframe op te halen. Houd er rekening mee dat dit object null kan zijn, dus u moet altijd controleren voordat u het object gebruikt. De typen mediaframes in de MediaFrameReference die wordt geretourneerd door TryAcquireLatestFrame, zijn afhankelijk van het type framebron of de framebronnen die u hebt geconfigureerd om door de framelezer te worden opgehaald. Omdat de framelezer in dit voorbeeld is ingesteld om audioframes te verkrijgen, wordt het onderliggende frame opgehaald met behulp van de eigenschap AudioMediaFrame .
Deze Helpermethode voor ProcessAudioFrame in het onderstaande voorbeeld laat zien hoe u een AudioFrame opvraagt dat informatie biedt, zoals de tijdstempel van het frame en of het niet wordt onderbroken van het AudioMediaFrame-object . Als u de audiovoorbeeldgegevens wilt lezen of verwerken, moet u het AudioBuffer-object ophalen uit het AudioMediaFrame-object , een IMemoryBufferReference maken en vervolgens de COM-methode IMemoryBufferByteAccess::GetBuffer aanroepen om de gegevens op te halen. Zie de opmerking hieronder in de code voor meer informatie over het openen van systeemeigen buffers.
De indeling van de gegevens is afhankelijk van de framebron. In dit voorbeeld hebben we er bij het selecteren van een mediaframebron expliciet voor gezorgd dat de geselecteerde framebron twee kanalen met floatgegevens heeft gebruikt. De rest van de voorbeeldcode laat zien hoe u de duur en het aantal voorbeelden voor de audiogegevens in het frame kunt bepalen.
private void MediaFrameReader_AudioFrameArrived(MediaFrameReader sender, MediaFrameArrivedEventArgs args)
{
using (MediaFrameReference reference = sender.TryAcquireLatestFrame())
{
if (reference != null)
{
ProcessAudioFrame(reference.AudioMediaFrame);
}
}
}
unsafe private void ProcessAudioFrame(AudioMediaFrame audioMediaFrame)
{
using (AudioFrame audioFrame = audioMediaFrame.GetAudioFrame())
using (AudioBuffer buffer = audioFrame.LockBuffer(AudioBufferAccessMode.Read))
using (IMemoryBufferReference reference = buffer.CreateReference())
{
byte* dataInBytes;
uint capacityInBytes;
float* dataInFloat;
var memoryBuffer = reference.As<IMemoryBufferByteAccess>();
memoryBuffer.GetBuffer(out dataInBytes, out capacityInBytes);
// The requested format was float
dataInFloat = (float*)dataInBytes;
// Get the number of samples by multiplying the duration by sampling rate:
// duration [s] x sampling rate [samples/s] = # samples
// Duration can be gotten off the frame reference OR the audioFrame
TimeSpan duration = audioMediaFrame.FrameReference.Duration;
// frameDurMs is in milliseconds, while SampleRate is given per second.
uint frameDurMs = (uint)duration.TotalMilliseconds;
uint sampleRate = audioMediaFrame.AudioEncodingProperties.SampleRate;
uint sampleCount = (frameDurMs * sampleRate) / 1000;
}
}
Opmerking
Als u wilt werken met de audiogegevens, moet u toegang krijgen tot een systeemeigen geheugenbuffer. Hiervoor moet u de IMemoryBufferByteAccess COM-interface gebruiken door de onderstaande codevermelding op te geven. Bewerkingen op de systeemeigen buffer moeten worden uitgevoerd in een methode die gebruikmaakt van het onveilige trefwoord. U moet ook het selectievakje inschakelen om onveilige code toe te staan op het tabblad Opbouwen van het dialoogvenster Project -> Eigenschappen.
[ComImport]
[Guid("5B0D3235-4DBA-4D44-865E-8F1D0E4FD04D")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
unsafe interface IMemoryBufferByteAccess
{
void GetBuffer(out byte* buffer, out uint capacity);
}
Aanvullende informatie over het gebruik van MediaFrameReader met audiogegevens
U kunt de AudioDeviceController ophalen die is gekoppeld aan de bron van het audioframe door toegang te krijgen tot de eigenschap MediaFrameSource.Controller . Dit object kan worden gebruikt om de stroomeigenschappen van het opnameapparaat op te halen of in te stellen of om het opnameniveau te beheren. In het volgende voorbeeld wordt het audioapparaat gedempt zodat frames blijven worden verkregen door de framelezer, maar alle voorbeelden hebben de waarde 0.
m_audioDeviceController.Muted = true;
U kunt een AudioFrame-object gebruiken om audiogegevens door te geven die zijn vastgelegd door een mediaframebron in een AudioGraph. Geef het frame door aan de AddFrame-methode van een AudioFrameInputNode. Zie Audiografieken voor meer informatie over het gebruik van audiografieken om audiosignalen vast te leggen, te verwerken en te combineren.
Verwante onderwerpen
Windows developer