TurqMage
TurqMage

Reputation: 3321

Finding the number of Channels from an AVAsset

I am loading Audio assets via AVAssets. I want to figure out how many channels (mono or stereo basically) are in the asset. What is the best way to do this?

Upvotes: 5

Views: 2883

Answers (2)

smartwolf
smartwolf

Reputation: 310

Swift 5 implementation of TurqMage's answer

//
//  AVAssetTrack+IsStereo.swift
//

import AVFoundation

extension AVAssetTrack {
    
    var isStereo: Bool {
        
        for item in (formatDescriptions as? [CMAudioFormatDescription]) ?? [] {
            
            let basic = CMAudioFormatDescriptionGetStreamBasicDescription(item)
            let numberOfChannels = basic?.pointee.mChannelsPerFrame ?? 0
            
            if numberOfChannels == 2 {
                return true
            }
        }
        return false
    }
}

Upvotes: 0

TurqMage
TurqMage

Reputation: 3321

This appears to be what I am looking for.

AVAssetTrack* songTrack = [mAssetToLoad.tracks objectAtIndex:0];
NSArray* formatDesc = songTrack.formatDescriptions;
for(unsigned int i = 0; i < [formatDesc count]; ++i) {
    CMAudioFormatDescriptionRef item = (CMAudioFormatDescriptionRef)[formatDesc objectAtIndex:i];
    const AudioStreamBasicDescription* bobTheDesc = CMAudioFormatDescriptionGetStreamBasicDescription (item);
    if(bobTheDesc && bobTheDesc->mChannelsPerFrame == 1) {
        mIsMono = true;
    }
}

Upvotes: 9

Related Questions