我有一个中等复杂的 AVAssetWriterInput 设置,我正在使用它来在录制时翻转相机。基本上运行两个会话,当用户点击翻转相机时,我将会话 1 从输出断开并附加会话 2。
这真的很棒。我可以导出视频,它播放得很好。
现在我正在尝试对生成的视频做更高级的事情,一些问题正在弹出,特别是导出的 AVAsset 内部的 AVAssetTracks 稍微不匹配(总是小于 1 帧)。具体来说,我正在尝试这样做:https ://www.raywenderlich.com/6236502-avfoundation-tutorial-adding-overlays-and-animations-to-videos但大部分时间最终都是全黑的帧,有时在视频的开头,有时在视频的尾部,会出现一瞬间。时间不同,但总是小于一帧(见下面的日志,1/30 或 0.033333333s)
我进行了一些来回调试,并设法使用我的录像机录制了一个视频,该录像机始终产生尾随黑框,但是使用教程代码我无法创建产生尾随黑框的视频。我在教程代码中添加了一些类似的日志记录(下面粘贴的内容),我看到的增量不超过 2/100 秒。所以最多大约是 1 帧的 1/10。有一次它甚至是一个完美的 0。
所以我现在的感觉是,正在发生的事情是我录制我的视频,两个assetInputs 开始吞噬数据,然后当我说“停止”时它们停止了。视频输入在最后一个完整帧处停止,音频输入也类似。但是由于音频输入的采样率比视频高得多,因此它们没有完美同步,我最终得到的音频比视频多。这不是问题,直到我用两条轨道组成资产,然后组成引擎认为我的意思是“是的,即使存在不匹配,实际上所有轨道都使用 100% 的时间”,这会导致黑屏.
(编辑:这基本上是正在发生的事情 - https://blender.stackexchange.com/questions/6268/audio-track-and-video-track-are-not-the-same-length)
我认为正确的解决方案是,与其担心构图结构和时间安排并确保一切正常,不如让捕获的音频和视频尽可能匹配。理想情况下为 0,但我可以接受大约 1/10 帧的任何内容。
所以我的问题是:如何使两个 AVAssetWriterInputs,一个音频和一个视频,连接到 AVAssetWriter 更好地排列?有地方设置吗?我会弄乱帧率吗?我应该将导出的资产修剪到视频轨道的长度吗?停止录制时可以复制最后捕获的帧吗?我可以让输入在不同的时间停止 - 基本上先停止音频然后等待视频“赶上”然后停止视频?还有什么?我在这里不知所措:|
我的日志
BUFFER | VIdeo SETTINGS: Optional(["AVVideoCompressionPropertiesKey": {
AllowFrameReordering = 1;
AllowOpenGOP = 1;
AverageBitRate = 7651584;
**ExpectedFrameRate = 30;**
MaxKeyFrameIntervalDuration = 1;
MaxQuantizationParameter = 41;
MinimizeMemoryUsage = 1;
Priority = 80;
ProfileLevel = "HEVC_Main_AutoLevel";
RealTime = 1;
RelaxAverageBitRateTarget = 1;
SoftMinQuantizationParameter = 18;
}, "AVVideoCodecKey": hvc1, "AVVideoWidthKey": 1080, "AVVideoHeightKey": 1920])
BUFFER | AUDIO SETTINGS Optional(["AVNumberOfChannelsKey": 1, "AVFormatIDKey": 1633772320, **"AVSampleRateKey": 48000**])
BUFFER | asset duration: 0.5333333333333333
BUFFER | video track duration: 0.5066666666666667
BUFFER | Audio track duration: 0.5333333333333333
**BUFFER | Asset Delta: -0.026666666666666616**
BUFFER | asset duration: 0.384
BUFFER | video track duration: 0.37333333333333335
BUFFER | Audio track duration: 0.384
**BUFFER | Asset Delta: -0.010666666666666658**
BUFFER | asset duration: 0.9405416666666667
BUFFER | video track duration: 0.935
BUFFER | Audio track duration: 0.9405416666666667
**BUFFER | Asset Delta: -0.005541666666666667**
教程日志
COMPOSE | asset duration: 0.7333333333333333
COMPOSE | video track duration: 0.7333333333333333
COMPOSE | audio track duration: 0.7316666666666667
**Delta: ~0.01667**
COMPOSE | asset duration: 1.3333333333333333
COMPOSE | video track duration: 1.3333333333333333
COMPOSE | audio track duration: 1.3316666666666668
**Delta: ~0.01667**
COMPOSE | asset duration: 1.0316666666666667
COMPOSE | video track duration: 1.0316666666666667
COMPOSE | audio track duration: 1.0316666666666667
**Delta: 0 (wow)**