Ios AVAssetWriterInput-黑屏,46小时长
我正在尝试进行AVCaptureSession并编码到mp4。看起来这应该很简单,我正在尝试编码一个960x540视频流;就本期而言,我并不担心音频 当我运行下面的代码并使用Xcode从文档容器中抓取Ios AVAssetWriterInput-黑屏,46小时长,ios,swift,avfoundation,avassetwriter,avasset,Ios,Swift,Avfoundation,Avassetwriter,Avasset,我正在尝试进行AVCaptureSession并编码到mp4。看起来这应该很简单,我正在尝试编码一个960x540视频流;就本期而言,我并不担心音频 当我运行下面的代码并使用Xcode从文档容器中抓取out2.mp4时,我在quicktime中看到一个黑屏,持续时间为46小时。至少决议看起来是正确的。下面是ffmpeg-iout2.mp4的输出 Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'out2.mp4': Metadata: major_br
out2.mp4
时,我在quicktime中看到一个黑屏,持续时间为46小时。至少决议看起来是正确的。下面是ffmpeg-iout2.mp4的输出
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'out2.mp4':
Metadata:
major_brand : mp42
minor_version : 1
compatible_brands: mp41mp42isom
creation_time : 2015-11-18 01:25:55
Duration: 46:43:04.21, start: 168178.671667, bitrate: 0 kb/s
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, smpte170m/bt709/bt709), 960x540, 1860 kb/s, 27.65 fps, 29.97 tbr, 600 tbn, 1200 tbc (default)
Metadata:
creation_time : 2015-11-18 01:25:55
handler_name : Core Media Video
在这种情况下,为什么我不能将示例缓冲区附加到AVAssetWriterInput
var videoInput: AVAssetWriterInput?
var assetWriter: AVAssetWriter?
override func viewDidLoad() {
super.viewDidLoad()
self.startStream()
NSTimer.scheduledTimerWithTimeInterval(5, target: self, selector: "swapSegment", userInfo: nil, repeats: false)
}
func swapSegment() {
assetWriter?.finishWritingWithCompletionHandler(){
print("File written")
}
videoInput = nil
}
func pathForOutput() -> String {
let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)
if let documentDirectory: NSURL = urls.first {
let fileUrl = documentDirectory.URLByAppendingPathComponent("out1.mp4")
return fileUrl.path!
}
return ""
}
func startStream() {
assetWriter = try! AVAssetWriter(URL: NSURL(fileURLWithPath: self.pathForOutput()), fileType: AVFileTypeMPEG4)
let videoSettings: [String: AnyObject] = [AVVideoCodecKey: AVVideoCodecH264, AVVideoWidthKey: 960, AVVideoHeightKey: 540]
videoInput = AVAssetWriterInput(mediaType: AVMediaTypeVideo, outputSettings: videoSettings)
videoInput!.expectsMediaDataInRealTime = true
assetWriter?.addInput(videoInput!)
assetWriter!.startWriting()
assetWriter!.startSessionAtSourceTime(kCMTimeZero)
let videoHelper = VideoHelper()
videoHelper.delegate = self
videoHelper.startSession()
}
func captureOutput(captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBufferRef, fromConnection connection: AVCaptureConnection!) {
if let videoOutput = captureOutput as? AVCaptureVideoDataOutput {
videoInput?.appendSampleBuffer(sampleBuffer)
}
}
可能您的演示时间与源时间无关(kCMTimeZero
)。您可以使用第一个缓冲区表示时间戳作为源时间
p、 在美国,即使使用if,46小时也可能是您设备的正常运行时间!sessionStarted{sessionStarted=true assetWriter!.startSessionAtSourceTime(CMSampleBufferGetPresentationTimeStamp(sampleBuffer))}
,我的持续时间为46小时。没关系,它可以工作!在尝试写入之前,请确保删除要写入的文件。