2016-09-22 20 views
0

我試圖設置自定義視頻壓縮在基於這個SO貼子,而不是使用Obj-C(How can I reduce the file size of a video created with UIImagePickerController?)的SWIFT。但是,我在轉換語法時遇到了一些問題,特別是上面的錯誤在字典中突出顯示。壓縮功能如下:類型DictionaryLiteral的值<_,_>不符合'任何'在版本

func convertVideoToLowQuailty(withInputURL inputURL: URL, outputURL: URL) { 
    //setup video writer 
    var videoAsset = AVURLAsset(url: inputURL, options: nil) 
    var videoTrack = videoAsset.tracks(withMediaType: AVMediaTypeVideo)[0] 
    var videoSize = videoTrack.naturalSize 
    var videoWriterCompressionSettings = [ 
     AVVideoAverageBitRateKey : Int(1250000) 
    ] 

    var videoWriterSettings : NSDictionary = [ 
     DictionaryLiteral : (Key: AVVideoCodecKey, Object: AVVideoCodecH264), 
     AVVideoCompressionPropertiesKey : videoWriterCompressionSettings, 
     AVVideoWidthKey : Int(videoSize.width), 
     AVVideoHeightKey : Int(videoSize.height) 
    ] 

    var videoWriterInput = AVAssetWriterInput(mediaType: AVMediaTypeVideo, outputSettings: videoWriterSettings as! [String : Any?]) 
    videoWriterInput.expectsMediaDataInRealTime = true 
    videoWriterInput.transform = videoTrack.preferredTransform 
    var videoWriter = try! AVAssetWriter(outputURL: outputURL, fileType: AVFileTypeMPEG4) 
    videoWriter.add(videoWriterInput) 
    //setup video reader 
    var videoReaderSettings = [ (kCVPixelBufferPixelFormatTypeKey as String) : Int(kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange) ] 
    var videoReaderOutput = AVAssetReaderTrackOutput(track: videoTrack, outputSettings: videoReaderSettings) 
    var videoReader = try! AVAssetReader(asset: videoAsset) 
    videoReader.add(videoReaderOutput) 
    //setup audio writer 
    var audioWriterInput = AVAssetWriterInput(mediaType: AVMediaTypeAudio, outputSettings: nil) 
    audioWriterInput.expectsMediaDataInRealTime = false 
    videoWriter.add(audioWriterInput) 
    //setup audio reader 
    var audioTrack = videoAsset.tracks(withMediaType: AVMediaTypeAudio)[0] 
    var audioReaderOutput = AVAssetReaderTrackOutput(track: audioTrack, outputSettings: nil) 
    var audioReader = try! AVAssetReader(asset: videoAsset) 
    audioReader.add(audioReaderOutput) 
    videoWriter.startWriting() 
    //start writing from video reader 
    videoReader.startReading() 
    videoWriter.startSession(atSourceTime: kCMTimeZero) 
    var processingQueue = DispatchQueue(label: "processingQueue1") 
    videoWriterInput.requestMediaDataWhenReady(on: processingQueue, using: {() -> Void in 
     while videoWriterInput.isReadyForMoreMediaData { 
      var sampleBuffer: CMSampleBuffer 
      if videoReader.status == .reading && (sampleBuffer == videoReaderOutput.copyNextSampleBuffer()!) { 
       videoWriterInput.append(sampleBuffer) 

      } 
      else { 
       videoWriterInput.markAsFinished() 
       if videoReader.status == .completed { 
        //start writing from audio reader 
        audioReader.startReading() 
        videoWriter.startSession(atSourceTime: kCMTimeZero) 
        var processingQueue = DispatchQueue(label: "processingQueue2") 
        audioWriterInput.requestMediaDataWhenReady(on: processingQueue, using: {() -> Void in 
         while audioWriterInput.isReadyForMoreMediaData { 
          var sampleBuffer: CMSampleBuffer 
          if audioReader.status == .reading && (sampleBuffer == (audioReaderOutput.copyNextSampleBuffer()!)) { 
           audioWriterInput.append(sampleBuffer) 
          } 
          else { 
           audioWriterInput.markAsFinished() 
           if audioReader.status == .completed { 
            videoWriter.finishWriting(completionHandler: {() -> Void in 
             self.sendMovieFile(at: outputURL) 
            }) 
           } 
          } 
         } 
        }) 
       } 
      } 

     } 
    }) 
} 
+0

改變你的videoWriterSettings聲明'VAR videoWriterSettings:[字符串:任何]' –

+0

@LeoDabus同樣的錯誤仍然存​​在 –

+0

'變種videoWriterSettings:[字符串:任何] = [AVVideoCodecKey:AVVideoCodecH264,AVVideoCompressionPropertiesKey:[AVVideoAverageBitRateKey:的NSNumber(值:1250000)], AVVideoWidthKey:videoSize.width作爲的NSNumber, AVVideoHeightKey:videoSize.height作爲的NSNumber]' –

回答

0

我不明白爲什麼你需要這條線:

DictionaryLiteral : (Key: AVVideoCodecKey, Object: AVVideoCodecH264), 

見此聯線,你可以寫這樣的事情:

var videoWriterCompressionSettings: [String: AnyObject] = [ 
     AVVideoAverageBitRateKey : 1250000 as NSNumber 
    ] 

    var videoWriterSettings : [String: AnyObject] = [ 
     AVVideoCodecKey: AVVideoCodecH264 as NSString, 
     AVVideoCompressionPropertiesKey : videoWriterCompressionSettings as NSDictionary, 
     AVVideoWidthKey : videoSize.width as NSNumber, 
     AVVideoHeightKey : videoSize.height as NSNumber 
    ] 

    var videoWriterInput = AVAssetWriterInput(mediaType: AVMediaTypeVideo, outputSettings: videoWriterSettings) 

(有人更喜歡[String: Any][String: AnyObject],說它更Swifty在Swift 3.使用Any,你可以刪除一些鑄件,但可能mistaki只包含一些僅在運行時纔會顯示的壞東西。)

而另一個很糟糕的代碼部分是as! [String : Any?]。您需要將[String: Any]?傳遞到AVAssetWriterInput.init(mediaType:outputSettings:),而不是[String: Any?]

(可能還有其他的一些不好的部分,我沒有檢查...)

+0

好的,謝謝非常多,我會檢查這個,希望它能修復,我用Obj-C轉換器來做到這一點,因爲我不明白Obj-C –

+0

@ j.doe,我明白了。有時候這些工具(包括Swift migrator)會產生奇怪的輸出。希望你能儘快解決你所有的問題。 – OOPer

相關問題