问题描述
我的屏幕录像机需要帮助。
从设备屏幕上记录我的.mp4文件后,我尝试打开它,但它不起作用。根据我录制屏幕的时间,文件大小会发生变化,这意味着此处正在写入文件。
根据状态判断,videoWriter 效果很好(仅处于写入状态和已完成状态) 也许setUpWriter()函数需要AVAsset的更多设置?我将不胜感激。
这是我的课堂字段:
import ReplayKit
class SampleHandler: rpbroadcastsamplehandler {
let screenWidth: CGFloat = 750//UIScreen.main.bounds.width
let screenHeight: CGFloat = 1334//UIScreen.main.bounds.height
var isRecording = false
var videoWriterInput: AVAssetWriterInput!
var audioWriterInput: AVAssetWriterInput!
var videoWriter: AVAssetWriter!
var sessionAtSourceTime: CMTime!
var outputFileLocation: URL!
此处为开始录制的代码:
override func broadcastStarted(withSetupInfo setupInfo: [String : NSObject]?) {
guard !isRecording else { return }
isRecording = true
sessionAtSourceTime = nil
setUpWriter()
}
func setUpWriter() {
self.outputFileLocation = videoFileLocation()
videoWriter = try? AVAssetWriter.init(outputURL: self.outputFileLocation,fileType: AVFileType.mp4)
// add video input
videoWriterInput = AVAssetWriterInput(mediaType: AVMediaType.video,outputSettings: [
AVVideoCodecKey : AVVideoCodecType.h264,AVVideoWidthKey : screenWidth - (screenWidth.truncatingRemainder(dividingBy: 16)),AVVideoHeightKey : screenHeight - (screenHeight.truncatingRemainder(dividingBy: 16)),AVVideoCompressionPropertiesKey : [AVVideoAverageBitRateKey : getBitRate()]
])
videoWriterInput.expectsMediaDataInRealTime = true
// add audio input
audioWriterInput = AVAssetWriterInput(mediaType: AVMediaType.audio,outputSettings: nil)
audioWriterInput.expectsMediaDataInRealTime = true
if videoWriter.canAdd(videoWriterInput) {
videoWriter.add(videoWriterInput)
}
if videoWriter.canAdd(audioWriterInput) {
videoWriter.add(audioWriterInput)
}
videoWriter.startWriting()
}
private func getBitRate() -> Int {
let numPixels: CGFloat = screenWidth * screenHeight
let bitsPerPixel: CGFloat = pow(2.0,1.0)
return Int(numPixels * bitsPerPixel)
}
这是用于进行编写的功能:
override func processSampleBuffer(_ sampleBuffer: CMSampleBuffer,with sampleBufferType: RPSampleBufferType) {
super.processSampleBuffer(sampleBuffer,with: sampleBufferType)
let writable = canWrite()
if writable,sessionAtSourceTime == nil {
// start writing
sessionAtSourceTime = CMSampleBufferGetPresentationTimeStamp(sampleBuffer)
videoWriter.startSession(atSourceTime: sessionAtSourceTime!)
}
if writable {
switch sampleBufferType {
case .video:
if videoWriterInput.isReadyForMoreMediaData {
videoWriterInput.append(sampleBuffer)
}
case .audioApp:
if audioWriterInput.isReadyForMoreMediaData {
audioWriterInput.append(sampleBuffer)
}
case .audioMic:
print("mic")
@unkNown default:
print("unkNown")
}
}
}
在这里我完成广播:
override func broadcastFinished() {
guard isRecording else { return }
isRecording = false
videoWriterInput.markAsFinished()
audioWriterInput.markAsFinished()
videoWriter.finishWriting { [weak self] in
self?.sessionAtSourceTime = nil
}
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)