用Swift录制视频的AVAssetWriter?
我已成功设置AVAssetWriter以录制视频并将其保存到我的相机卷。唯一的问题是录制的视频的第一帧是空白的白色帧。有什么办法可以让我绕过这件事吗?发生了什么事 您是否对视频帧进行任何操作?在我的例子中,我在写之前调整了视频帧的大小。在这种情况下,首先写入音频帧,然后写入视频帧。因此,前几帧在预览中显示为白色。但在视频播放中几乎看不到 解决方案: 在使用avasssetwriter编写视频帧之前,请跳过编写音频帧用Swift录制视频的AVAssetWriter?,swift,xcode,avassetwriter,Swift,Xcode,Avassetwriter,我已成功设置AVAssetWriter以录制视频并将其保存到我的相机卷。唯一的问题是录制的视频的第一帧是空白的白色帧。有什么办法可以让我绕过这件事吗?发生了什么事 您是否对视频帧进行任何操作?在我的例子中,我在写之前调整了视频帧的大小。在这种情况下,首先写入音频帧,然后写入视频帧。因此,前几帧在预览中显示为白色。但在视频播放中几乎看不到 解决方案: 在使用avasssetwriter编写视频帧之前,请跳过编写音频帧 captureoutput的推荐代码 func captureOutput(_
captureoutput的推荐代码
func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection!) {
if CMSampleBufferDataIsReady(sampleBuffer) == false
{
// Handle error
return;
}
startTime = CMSampleBufferGetPresentationTimeStamp(sampleBuffer)
if videoWriter.status == AVAssetWriterStatus.Unknown {
videoWriter.startWriting()
videoWriter.startSessionAtSourceTime(startTime)
return
}
if videoWriter.status == AVAssetWriterStatus.Failed {
// Handle error here
return;
}
// Here you collect each frame and process it
if(recordingInProgress){
if let _ = captureOutput as? AVCaptureVideoDataOutput {
if videoWriterInput.isReadyForMoreMediaData{
videoWriterInput.append(sampleBuffer)
video_frames_written = true
}
}
if let _ = captureOutput as? AVCaptureAudioDataOutput {
if audioWriterInput.isReadyForMoreMediaData && video_frames_written{
audioWriterInput.append(sampleBuffer)
}
}
}
}
你在视频帧上做任何操作吗?在我的例子中,我在写之前调整了视频帧的大小。在这种情况下,首先写入音频帧,然后写入视频帧。因此,前几帧在预览中显示为白色。但在视频播放中几乎看不到 解决方案: 在使用avasssetwriter编写视频帧之前,请跳过编写音频帧
captureoutput的推荐代码
func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection!) {
if CMSampleBufferDataIsReady(sampleBuffer) == false
{
// Handle error
return;
}
startTime = CMSampleBufferGetPresentationTimeStamp(sampleBuffer)
if videoWriter.status == AVAssetWriterStatus.Unknown {
videoWriter.startWriting()
videoWriter.startSessionAtSourceTime(startTime)
return
}
if videoWriter.status == AVAssetWriterStatus.Failed {
// Handle error here
return;
}
// Here you collect each frame and process it
if(recordingInProgress){
if let _ = captureOutput as? AVCaptureVideoDataOutput {
if videoWriterInput.isReadyForMoreMediaData{
videoWriterInput.append(sampleBuffer)
video_frames_written = true
}
}
if let _ = captureOutput as? AVCaptureAudioDataOutput {
if audioWriterInput.isReadyForMoreMediaData && video_frames_written{
audioWriterInput.append(sampleBuffer)
}
}
}
}
我认为这可能有效,但似乎即使我只在编写视频帧时才编写音频帧,但仍然存在一个白色帧,其中既没有录制视频也没有录制音频。还有其他建议吗?你能分享录制的文件吗?可以是第一个samplebuffer的日志吗?下面是一个视频示例。录像机的设置方式是每秒钟录制一个新片段,但问题不在于此,因为在录制的第一秒钟仍然有一个没有视频或音频的空白帧。我将为示例缓冲区添加上面的代码,但是我不知道如何获取它的日志基本概念如下:当你调用startTime时,它会告诉muxer用pts(表示时间戳)准备文件。然后,muxer期望帧具有之后的时间戳,并根据时间戳写入文件。假设你告诉muxer从1秒开始,你在3秒写了一个视频帧,然后持续1-3秒,视频将是空白的。相反,如果你告诉muxer从第3秒开始,并在第3秒开始写入视频,视频将不会是空白的。我认为这可能会起作用,但似乎即使我只在写入视频帧时才写入音频帧,仍然存在一个白色帧,其中没有录制视频或音频。还有其他建议吗?你能分享录制的文件吗?可以是第一个samplebuffer的日志吗?下面是一个视频示例。录像机的设置方式是每秒钟录制一个新片段,但问题不在于此,因为在录制的第一秒钟仍然有一个没有视频或音频的空白帧。我将为示例缓冲区添加上面的代码,但是我不知道如何获取它的日志基本概念如下:当你调用startTime时,它会告诉muxer用pts(表示时间戳)准备文件。然后,muxer期望帧具有之后的时间戳,并根据时间戳写入文件。假设你告诉muxer从1秒开始,你在3秒写了一个视频帧,然后持续1-3秒,视频将是空白的。相反,如果您告诉muxer在第3秒开始,并在第3秒开始写入视频,视频将不会是空白的。