[Libav-user] AVAudioEngine audio playing in slow-motion?
Isaksson Jörgen
jogga at bitfield.se
Thu Jan 28 17:12:59 CET 2016
Hi all,
I'm trying to make a simple audio player using Libav and the new AVAudioEngine introduced in iOS 8 and OS X 10.10.
I have gotten to the point where it actually plays audio decoded by Libav, but the problem is that it's playing at half speed?
Surely I must have mixed up something in swr_convert or else where, but I just can't figure out how to fix the problem.
This is how I set up the AVAudioEngine...
_engine = [[AVAudioEngine alloc] init];
_player = [[AVAudioPlayerNode alloc] init];
[self.engine attachNode:self.player];
AVAudioChannelCount outputChannelCount = 2;
double outputSampleRate = 48000;
AVAudioFormat *audioOutputFormat = [[AVAudioFormat alloc] initStandardFormatWithSampleRate:outputSampleRate channels:outputChannelCount];
AVAudioFormat is a wrapper around the good old AudioStreamBasicDescription which translates audioOutputFormat into this...
NSLog(@"audioOutputFormat: %@", audioOutputFormat.settings);
2016-01-28 13:37:18.416 AudioQueuePlayer[53198:7804348] audioOutputFormat: {
AVFormatIDKey = 1819304813;
AVLinearPCMBitDepthKey = 32;
AVLinearPCMIsBigEndianKey = 0;
AVLinearPCMIsFloatKey = 1;
AVLinearPCMIsNonInterleaved = 1;
AVNumberOfChannelsKey = 2;
AVSampleRateKey = 48000;
}
I configure a PCM buffer to put some data into...
AVAudioPCMBuffer *buffer = [[AVAudioPCMBuffer alloc] initWithPCMFormat:audioOutputFormat frameCapacity:bufferCapacity];
Now I configure and init my SwrContext like this...
struct SwrContext *audioConvertContext;
audioConvertContext = swr_alloc_set_opts(NULL,
av_get_default_channel_layout(outputChannelCount), // output 2 = stereo
AV_SAMPLE_FMT_FLT, // output float
outputSampleRate, // output sample rate
codecContext->channel_layout, // input channel layout
codecContext->sample_fmt, // input sample format
codecContext->sample_rate, // input sample rate
0,
NULL);
Now on to the decoding part...
// decode the packet
bytesDecodec = avcodec_decode_audio4(codecContext, frame, &isFrameDecoded, &packet);
// calculate the size for our resampled buffer
swrBufferSize = av_samples_get_buffer_size(NULL, outputChannelCount, frame->nb_samples, AV_SAMPLE_FMT_FLT, 0);
// a pointer to the buffer
uint8_t *bufPtr = (uint8_t *)buffer.floatChannelData[0];
bufPtr += buffer.frameLength;
// resample audio
int numSamplesConverted = swr_convert(audioConvertContext,
&bufPtr,
frame->nb_samples,
(const uint8_t **)frame->extended_data,
frame->nb_samples);
// advance the buffer and keep decoding until the buffer is full
buffer.frameLength += swrBufferSize;
When the buffer is full I play it like so...
[self.player scheduleBuffer:buffer completionHandler:nil];
[self.player play];
As mentioned above I can hear the sound perfectly, but at half speed/rate. In slow motion!
The weird thing is that if I double my outputSampleRate to 96000, the sound plays perfectly???
But I don't want the outputSampleRate to be 96000, I want it to be 48000.
I’m obviously not very experienced in this field.
Any of you sound wizards out there who can help me??? Please.
Best regards / Jörgen
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://ffmpeg.org/pipermail/libav-user/attachments/20160128/d840c50c/attachment.html>
More information about the Libav-user
mailing list