Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

AVAsset tracks is empty

Essentially I am looking to concatenate AVAsset files. I've got a rough idea of what to do but I'm struggling with loading the audio files.

I can play the files with an AVAudioPlayer, I can see them in the directory via my terminal, but when I attempt to load them with AVAssetURL it always returns an empty array for tracks.

The URL I am using:

NSURL *firstAudioFileLocation = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@%@", workingDirectory , @"/temp.pcm"]];

Which results in:

file:///Users/evolve/Library/Developer/CoreSimulator/Devices/8BF465E8-321C-47E6-BF2E-049C5E900F3C/data/Containers/Data/Application/4A2D29B2-E5B4-4D07-AE6B-1DD15F5E59A3/Documents/temp.pcm



The asset being loaded:

AVAsset *test = [AVURLAsset URLAssetWithURL:firstAudioFileLocation options:nil];

However when calling this:

NSLog(@" total tracks %@", test.tracks);

My output is always total tracks ().

My subsequent calls to add them to my AVMutableCompositionTrack end up crashing the app as the AVAsset seems to not have loaded correctly.



I have played with other variations for loading the asset including:

NSURL *alternativeLocation = [[NSBundle mainBundle] URLForResource:@"temp" withExtension:@"pcm"];

As well as trying to load AVAsset with the options from the documentation:

NSDictionary *assetOptions = @{AVURLAssetPreferPreciseDurationAndTimingKey: @YES};



How do I load the tracks from a local resource, recently created by the AVAudioRecorder?

EDIT

I had a poke around and found I can record and load a .CAF file extension.

Seems .PCM is unsupported for AVAsset, this page also was of great help. https://developer.apple.com/documentation/avfoundation/avfiletype

like image 791
Malii Avatar asked Feb 05 '23 03:02

Malii


1 Answers

An AVAsset load is not instantaneous. You need to wait for the data to be available. Example:

AVAsset *test = [AVURLAsset URLAssetWithURL:firstAudioFileLocation options:nil];
[test loadValuesAsynchronouslyForKeys:@[@"playable",@"tracks"] completionHandler:^{

    // Now tracks is available
    NSLog(@" total tracks %@", test.tracks);
}];

A more detailed example can be found in the documentation.

like image 122
Gerd K Avatar answered Feb 10 '23 22:02

Gerd K