Vishal Shah
Vishal Shah

Reputation: 1107

No sound when I play an AVMutableComposition with AVPlayer

I'm trying to create an AVMutableComposition and playing it using AVPlayer. This is what I'm doing.

//Define the AVComposition

self.composition = [[AVMutableComposition alloc] init];

//Define Mutable Track

self.mainVideoTrack = [self.composition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];

//Define the asset

AVAsset *asset = [AVAsset assetWithURL:url];

//Insert the asset in the track

[self.mainVideoTrack insertTimeRange:CMTimeRangeFromTimeToTime(CMTimeMake(0,1000),CMTimeMake(asset.duration*1000,1000)) ofTrack:[[asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] atTime:[self startingTimeForSegment:videoSegment] error:&error];

//Define player item with the composition

self.playerItem = [[AVPlayerItem alloc] initWithAsset:self.composition];

//Define the player, player layer & add the layer

self.avPlayer = [[AVPlayer alloc]initWithPlayerItem:self.playerItem];
self.layerVideo = [AVPlayerLayer playerLayerWithPlayer:self.avPlayer];
self.layerVideo.frame = self.previewContainer.bounds;
[self.previewContainer.layer addSublayer:self.layerVideo];

However I can hear no sound in the player layer. If I initialize the playeritem directly with the asset without using AVMutableComposition, it plays the sound. What am I doing wrong? Stuck on this.

Upvotes: 1

Views: 1677

Answers (1)

Jonathan
Jonathan

Reputation: 301

It looks like you are only adding one track to your AVMutableComposition. You would need to add the Audio track from the asset as well. This can be done exactly the same way as adding a video track.

self.mainAudioTrack = [self.composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];

And then you can insert from your assets audio track. This is assuming you want your audio to start at the same point your video does.

[self.mainAudioTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero,asset.duration) ofTrack:[[asset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0] atTime:[self startingTimeForSegment:audio] error:&error];

Upvotes: 5

Related Questions