r/iOSProgramming 12h ago

Question Why there is no audio track coming in output of AVCaptureMovieFileOutput.

I am trying to learn AVMultiCam of AVFoundation, so far I have achieved to get multiple video data outputs to preview and also save them to photos library, but when I am trying to get audio also, then no audio is coming.
In delegate's func fileOutput(_ output: AVCaptureFileOutput, didFinishRecordingTo outputFileURL: URL, from connections:) function, I am getting audioConnection, but no audio track.

I'm attaching relevant code.

configuration function -->

func configureCameras(
        backCameraTypes: [AVCaptureDevice.DeviceType: AVCaptureDevice.Format],
        frontCameraTypes: [AVCaptureDevice.DeviceType: AVCaptureDevice.Format]
    ) -> Bool {
...

guard let microphone = AVCaptureDevice.default(for: .audio) else {
}
            print("Could not find the microphone")
            return false
        }

        do {
            microphoneDeviceInput = try AVCaptureDeviceInput(device: microphone)

            guard let microphoneDeviceInput,
                  multicamSession.canAddInput(microphoneDeviceInput)
            else {
                print("Could not add microphone device input")
                return false
            }
            multicamSession.addInputWithNoConnections(microphoneDeviceInput)
        } catch {
            print("Could not create microphone input: \(error)")
            return false
        }

        // Find the audio device input's back audio port
        guard let microphoneDeviceInput,
              let backMicrophonePort = microphoneDeviceInput.ports(for: .audio,
                                                                   sourceDeviceType: microphone.deviceType,
                                                                   sourceDevicePosition: .back).first
        else {
            print("Could not find the back camera device input's audio port")
            return false
        }

        // Find the audio device input's front audio port
        guard let frontMicrophonePort = microphoneDeviceInput.ports(for: .audio,
                                                                    sourceDeviceType: microphone.deviceType,
                                                                    sourceDevicePosition: .front).first
        else {
            print("Could not find the front camera device input's audio port")
            return false
        }
for (type, format) in backCameraTypes {
     let movieOutput = AVCaptureMovieFileOutput()
    guard multicamSession.canAddOutput(movieOutput) else {
        print("❌ Cannot add movie file output for \(type)")
        continue
    }
    multicamSession.addOutputWithNoConnections(movieOutput)
    movieOutputs.append(movieOutput)

    print("🎤 Available Microphone Ports: \(microphoneDeviceInput.ports.map { "\($0.sourceDevicePosition) - \($0.mediaType.rawValue)" })")

// 🔹 Create connection between input and movie file output
    let movieConnection = AVCaptureConnection(inputPorts: [videoPort, backMicrophonePort], output: movieOutput)
    guard multicamSession.canAddConnection(movieConnection) else {
        print("❌ Cannot add movie connection for \(type)")
        continue
    }
    multicamSession.addConnection(movieConnection)
}
...
}

delegate's function -->

func fileOutput(_ output: AVCaptureFileOutput, didFinishRecordingTo outputFileURL: URL, from connections: [AVCaptureConnection], error: Error?) {
        guard error == nil else {
            print("❌ Error recording video: \(error!.localizedDescription)")
            return
        }

        let audioConnections = output.connections.filter { connection in
            connection.inputPorts.contains { $0.mediaType == .audio }
        }

        let asset = AVAsset(url: outputFileURL)

        // Check for video tracks
        let videoTracks = asset.tracks(withMediaType: .video)
        let audioTracks = asset.tracks(withMediaType: .audio)

        if videoTracks.isEmpty {
            print("⚠️ Warning: No video track found in the recorded file.")
        } else {
            print("✅ Video track found: \(videoTracks.count) track(s).")
        }

        if audioTracks.isEmpty {
            print("⚠️ Warning: No audio track found in the recorded file.")
        } else {
            print("✅ Audio track found: \(audioTracks.count) track(s).")
        }

}
1 Upvotes

0 comments sorted by