swiftswiftuiavplayer

AVPlayer audio only works when ringer is on


With SwiftUI, I have a custom avplayer that auto plays and loops the video. The problem is whether or not I specifically tell avplayer to unmute, it is still muted. The physical volume buttons have no effect. The only way to toggle mute on/off is to physically switch the ringer to silent (muted) or not silent (unmute).

Here is the parent view:

struct VideoCacheView: View {
    @State private var avPlayer: AVPlayer? = nil
    public let url: String
    public let thumbnailURL: String
    var body: some View {
        if self.avPlayer != nil {
            CustomVideoPlayer(player: Binding(self.$avPlayer)!)
                .onAppear {
                    self.avPlayer?.isMuted = false
                    self.avPlayer?.play()
                }
        }
    }
}

and the child:

struct CustomVideoPlayer: UIViewControllerRepresentable {
    @EnvironmentObject var cvm: CameraViewModel
    @Binding var player: AVPlayer
    
    func makeCoordinator() -> Coordinator {
        return Coordinator(self)
    }
    
    func makeUIViewController(context: Context) -> AVPlayerViewController {
        let controller = AVPlayerViewController()
        controller.player = self.player
        controller.showsPlaybackControls = false
        controller.videoGravity = self.cvm.videoGravity
        player.actionAtItemEnd = .none
        
        NotificationCenter.default.addObserver(context.coordinator, selector: #selector(context.coordinator.restartPlayback), name: .AVPlayerItemDidPlayToEndTime, object: player.currentItem)
        
        return controller
    }
    
    func updateUIViewController(_ uiViewController: AVPlayerViewController, context: Context) { }
    
    class Coordinator: NSObject {
        public var parent: CustomVideoPlayer
        init(_ parent: CustomVideoPlayer) {
            self.parent = parent
        }
        
        @objc func restartPlayback () {
            self.parent.player.seek(to: .zero)
        }
    }
}

Why is the only volume control my avplayer has is with the physicaly silent switch?


Solution

  • https://developer.apple.com/documentation/avfoundation/avplayer/1390127-volume

    Turns out that the volume is set to 0.0 when ringer is in silent mode. By setting the volume to 1.0 by default, there is volume all the time.

    Added this:

    self.player?.volume = 1.0
    

    inside of the child view below the videoGravity line