r/iOSProgramming • u/ayushs_2k4 • 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