Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Swift录制视频的AVAssetWriter?_Swift_Xcode_Avassetwriter - Fatal编程技术网

用Swift录制视频的AVAssetWriter?

用Swift录制视频的AVAssetWriter?,swift,xcode,avassetwriter,Swift,Xcode,Avassetwriter,我已成功设置AVAssetWriter以录制视频并将其保存到我的相机卷。唯一的问题是录制的视频的第一帧是空白的白色帧。有什么办法可以让我绕过这件事吗?发生了什么事 您是否对视频帧进行任何操作?在我的例子中,我在写之前调整了视频帧的大小。在这种情况下,首先写入音频帧,然后写入视频帧。因此,前几帧在预览中显示为白色。但在视频播放中几乎看不到 解决方案: 在使用avasssetwriter编写视频帧之前,请跳过编写音频帧 captureoutput的推荐代码 func captureOutput(_

我已成功设置AVAssetWriter以录制视频并将其保存到我的相机卷。唯一的问题是录制的视频的第一帧是空白的白色帧。有什么办法可以让我绕过这件事吗?发生了什么事

您是否对视频帧进行任何操作?在我的例子中,我在写之前调整了视频帧的大小。在这种情况下,首先写入音频帧,然后写入视频帧。因此,前几帧在预览中显示为白色。但在视频播放中几乎看不到

解决方案:

在使用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)
            }

        }

    }

}

你在视频帧上做任何操作吗?在我的例子中,我在写之前调整了视频帧的大小。在这种情况下,首先写入音频帧,然后写入视频帧。因此,前几帧在预览中显示为白色。但在视频播放中几乎看不到

解决方案:

在使用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秒开始写入视频,视频将不会是空白的。