Bir AVCaptureSession almaya çalışıyorum ve mp4'e kodlarım. Bunun açık olması gerektiği gibi görünüyor ve tek bir 960x540 video akışını kodlamaya çalışıyorum; Bu konuda ses konusunda endişelenmiyorum.AVAssetWriterInput - siyah ekran, 46 saat uzunluğunda
Aşağıdaki kodu çalıştırdığımda ve Xcode ile belge kapsayıcısından out2.mp4
kaptığımda, hızlı bir şekilde siyah bir ekran alıyorum ve süre 46 saat sürüyor. En azından çözünürlük doğru görünüyor. İşte ffmpeg -i out2.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
Neden bu senaryoda AVAssetWriterInput
örnek tampon ekleme olamaz çıktısı var?
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)
}
}
Bunu nasıl yaparım? –
Eğer "! SessionStarted { sessionStarted = true assetWriter! .startSessionAtSourceTime (CMSampleBufferGetPresentationTimeStamp (sampleBuffer)) }' ile bir süre olsa bile, 46 saat süre alırım. –
Boşver, işe yarıyor! Yazmaya çalışırken yazdığınız dosyayı sildiğinizden emin olun. –