Hi all -

I'm having no luck converting a VBR MP3 network stream into an uncompresed
format file.  Been banging my head on it for a few days.


The mp3 stream could be either 1 or 2 channels.    Currently I'm having
trouble getting just 1 channel to work.


I think where I'm going wrong is in determining the number of frames to
send to ExtAudioFileWrite.


I'm trying to write to the file inside the Audio File Stream service
callback:


static void SR_MyAFSPacketsProc ( void *inClientData,
    UInt32 inNumberBytes, UInt32 inNumberPackets,
    const void *inInputData, AudioStreamPacketDescription
*inPacketDescriptions ) {

}


Because the input file stream is a VBR MP3,
inPacketDescriptions[0].mVariableFramesInPacket is always 0.   And the
mp3StreamASBD's mFramesPerPacket makes no sense.  Also *mBytesPerFrame is 0
(I understand this is to be expected for the compressed mp3 format)  *


For my stream's ASBD mFramesPerPacket is 576 and a callback to the
AudioFileStream service packet callback may offer 12235 bytes in 233
packets.   If I use the stream's mFramesPerPacket of 576 * 233 packets, I
get 134208 frames.   134208 frames for 12235 bytes seems a bit off.



Anyone out there have a suggestion how to determine the number of frames to
pass to ExtAudioFileWrite?




I think I'm doing everything else correctly:


This is the ASBD I am using for the output file:

dstFormat.mSampleRate = sampleRate;
dstFormat.mChannelsPerFrame = channelCount;
dstFormat.mFormatID = kAudioFormatLinearPCM;
dstFormat.mFormatFlags = kAudioFormatFlagIsSignedInteger |
kAudioFormatFlagsNativeEndian | kAudioFormatFlagIsPacked;
dstFormat.mBitsPerChannel = 16;
dstFormat.mBytesPerPacket = dstFormat.mBytesPerFrame = 2 *
dstFormat.mChannelsPerFrame;
dstFormat.mFramesPerPacket = 1;


In the AudioFileStream Property listener callback for
kAudioFileStreamProperty_ReadyToProducePackets,  I use the output file ASBD
to both create the file (ExtAudioFileCreateWithURL) and to set the
clientDataFormat on that file (ExtAudioFileSetProperty with
kExtAudioFileProperty_ClientDataFormat).



NSURL *url = [NSURL fileURLWithPath:@"/testout/lpcmout.caf"];
CFURLRef sourceURL = (__bridge CFURLRef) url;

SR_CheckError(ExtAudioFileCreateWithURL(sourceURL, kAudioFileCAFType,
&sr_fileDesc, *NULL*, kAudioFileFlags_EraseFile, &sr_audioFile), "create
output file failed");

SR_CheckError(ExtAudioFileSetProperty(sr_audioFile,
kExtAudioFileProperty_ClientDataFormat,
sizeof (AudioStreamBasicDescription), &sr_fileDesc), "Couldn't set client
data format on input ext file");



Thank you-

Matt
 _______________________________________________
Do not post admin requests to the list. They will be ignored.
Coreaudio-api mailing list      ([email protected])
Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/coreaudio-api/archive%40mail-archive.com

This email sent to [email protected]

Reply via email to