Search code examples
objective-cswiftmpmovieplayercontrolleravplayer

Converting AVPlayer code to Swift


This is my attempt at converting the following Objective-C to Swift:

AVURLAsset * asset = [AVURLAsset URLAssetWithURL:[self localMovieURL] options:nil];
NSArray *audioTracks = [asset tracksWithMediaType:AVMediaTypeAudio];

// Mute all the audio tracks
NSMutableArray * allAudioParams = [NSMutableArray array];
for (AVAssetTrack *track in audioTracks) {
        AVMutableAudioMixInputParameters *audioInputParams =[AVMutableAudioMixInputParameters audioMixInputParameters];
        [audioInputParams setVolume:0.0 atTime:kCMTimeZero ];
        [audioInputParams setTrackID:[track trackID]];
        [allAudioParams addObject:audioInputParams];
}
AVMutableAudioMix * audioZeroMix = [AVMutableAudioMix audioMix];
[audioZeroMix setInputParameters:allAudioParams];

// Create a player item
AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:asset];
[playerItem setAudioMix:audioZeroMix]; // Mute the player item

// Create a new Player, and set the player to use the player item
// with the muted audio mix
AVPlayer *player = [AVPlayer playerWithPlayerItem:playerItem];

self.mPlayer = player;

[mPlayer play];

Swift:

I'm not sure what to do with kCMTimeZero below.

var moviePlayerController = MPMoviePlayerController()
var asset: AVURLAsset?
asset = AVURLAsset.URLAssetWithURL(self.moviePlayerController.contentURL, options: nil)
var audioTracks = NSArray()
audioTracks = asset!.tracksWithMediaType(AVMediaTypeAudio)

// Mute all the audio tracks
let allAudioParams = NSMutableArray()
for track: AnyObject in audioTracks {
    // AVAssetTrack
    let audioInputParams = AVMutableAudioMixInputParameters()

    // kCMTimeZero in Swift? How!?
    audioInputParams.setVolume(0.0, atTime: kCMTimeZero)

    audioInputParams.trackID = track.trackID
    allAudioParams.addObject(audioInputParams)
}

let audioZeroMix = AVMutableAudioMix()
audioZeroMix.inputParameters = allAudioParams

// Create a player item
let playerItem = AVPlayerItem(asset: asset)
playerItem.audioMix = audioZeroMix

// Create a new Player, and set the player to use the player item
// with the muted audio mix

// What do I do with player exactly.
let player = AVPlayer.playerWithPlayerItem(playerItem) as AVPlayer

self.moviePlayerController = player
self.moviePlayerController.play()

Solution

  • kCMTimeZero is part of the Core Media framework and so you must import it like this:

    import CoreMedia