如果视频超过 12 秒则没有声音
No sound if video is more then 12 seconds
我使用 AVFoundation 创建了一个自定义视频录制应用程序。
问题是当录音达到 13 秒时,声音从结果视频中完全消失。
我用代码设置相机:
private func configure(_ mode: CameraMode) {
guard let devices = AVCaptureDevice.devices(withMediaType: AVMediaTypeVideo) as? [AVCaptureDevice] else {return}
for device in devices {
if device.position == .back {
do {
let input = try AVCaptureDeviceInput(device: device)
if session.canAddInput(input) {
session.addInput(input)
}
configureVideoOutput(for: device)
session.startRunning()
} catch (let error) {
print(error)
}
}
}
}
private func configureVideoOutput(for device: AVCaptureDevice) {
if device.hasMediaType(AVMediaTypeVideo) && session.canAddOutput(sessionVideoOutput) {
session.beginConfiguration()
session.sessionPreset = AVCaptureSessionPresetHigh
guard let devices = AVCaptureDevice.devices(withMediaType: AVMediaTypeAudio) as? [AVCaptureDevice] else {return}
for device in devices {
do {
currentDevice = device
let input = try AVCaptureDeviceInput(device: device)
if session.canAddInput(input) {
session.addInput(input)
break
}
} catch (let error) {
print(error)
session.commitConfiguration()
}
}
session.addOutput(sessionVideoOutput)
session.commitConfiguration()
}
}
并使用此代码为明星录制视频:
@objc private func takeVideo(_ gesture: UILongPressGestureRecognizer) {
switch gesture.state {
case .began:
print("begin take video")
configure(.video)
if let _ = sessionVideoOutput.connection(withMediaType: AVMediaTypeAudio) {
let fileName = "mysavefile.mp4";
let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
let filePath = documentsURL.appendingPathComponent(fileName)
sessionVideoOutput.startRecording(toOutputFileURL: filePath, recordingDelegate: self)
setCaptureButtonToVideoMode(on: true)
}
case .ended, .cancelled:
print("end take video")
sessionVideoOutput.stopRecording()
setCaptureButtonToVideoMode(on: false)
default:
break
}
}
最后我将视频保存到相机胶卷:
func capture(_ captureOutput: AVCaptureFileOutput!, didFinishRecordingToOutputFileAt outputFileURL: URL!, fromConnections connections: [Any]!, error: Error!) {
print("capture did finish")
print(captureOutput)
print(outputFileURL)
PHPhotoLibrary.shared().performChanges({
PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: outputFileURL)
}) { saved, error in
}
}
如果视频小于 13 秒,则一切正常。
当我录制电影时,我使用 VCaptureMovieFileOutput()
作为会话输出,它有 属性 调用 movieFragmentInterval
,默认设置为 10 秒。将此 属性 更改为 kCMTimeInvalid
解决了问题。
我使用 AVFoundation 创建了一个自定义视频录制应用程序。 问题是当录音达到 13 秒时,声音从结果视频中完全消失。 我用代码设置相机:
private func configure(_ mode: CameraMode) {
guard let devices = AVCaptureDevice.devices(withMediaType: AVMediaTypeVideo) as? [AVCaptureDevice] else {return}
for device in devices {
if device.position == .back {
do {
let input = try AVCaptureDeviceInput(device: device)
if session.canAddInput(input) {
session.addInput(input)
}
configureVideoOutput(for: device)
session.startRunning()
} catch (let error) {
print(error)
}
}
}
}
private func configureVideoOutput(for device: AVCaptureDevice) {
if device.hasMediaType(AVMediaTypeVideo) && session.canAddOutput(sessionVideoOutput) {
session.beginConfiguration()
session.sessionPreset = AVCaptureSessionPresetHigh
guard let devices = AVCaptureDevice.devices(withMediaType: AVMediaTypeAudio) as? [AVCaptureDevice] else {return}
for device in devices {
do {
currentDevice = device
let input = try AVCaptureDeviceInput(device: device)
if session.canAddInput(input) {
session.addInput(input)
break
}
} catch (let error) {
print(error)
session.commitConfiguration()
}
}
session.addOutput(sessionVideoOutput)
session.commitConfiguration()
}
}
并使用此代码为明星录制视频:
@objc private func takeVideo(_ gesture: UILongPressGestureRecognizer) {
switch gesture.state {
case .began:
print("begin take video")
configure(.video)
if let _ = sessionVideoOutput.connection(withMediaType: AVMediaTypeAudio) {
let fileName = "mysavefile.mp4";
let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
let filePath = documentsURL.appendingPathComponent(fileName)
sessionVideoOutput.startRecording(toOutputFileURL: filePath, recordingDelegate: self)
setCaptureButtonToVideoMode(on: true)
}
case .ended, .cancelled:
print("end take video")
sessionVideoOutput.stopRecording()
setCaptureButtonToVideoMode(on: false)
default:
break
}
}
最后我将视频保存到相机胶卷:
func capture(_ captureOutput: AVCaptureFileOutput!, didFinishRecordingToOutputFileAt outputFileURL: URL!, fromConnections connections: [Any]!, error: Error!) {
print("capture did finish")
print(captureOutput)
print(outputFileURL)
PHPhotoLibrary.shared().performChanges({
PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: outputFileURL)
}) { saved, error in
}
}
如果视频小于 13 秒,则一切正常。
当我录制电影时,我使用 VCaptureMovieFileOutput()
作为会话输出,它有 属性 调用 movieFragmentInterval
,默认设置为 10 秒。将此 属性 更改为 kCMTimeInvalid
解决了问题。