Уменьшить размер видео до указанного размера - PullRequest
0 голосов
/ 25 октября 2018

Я хочу обрезать видео и сжать его, а затем загрузить файл на сервер, на стороне сервера у меня есть ограничение по размеру для 25 мегабайт и ограничение по времени для 1 минуты.Я использую модуль PryntTrimmerView для обрезки видео максимум одну минуту, а затем мне нужно сжать обрезанное видео до 25 МБ.у меня есть код для сжатия видео, я очень много искал эту тему, но не могу найти, где моя проблема с сжатием видео.Я тестирую два видеофайла размером 173,9 МБ и 34,6 МБ на диске.теперь после сжатия 173,9 уменьшилось до 50,71 и 34,6 уменьшилось до 54,44, я не знаю, почему 34,6 уменьшилось до 54,44!Как можно сжать видео до 25 МГ на диске?Вот мой код для сжатия видео и получения размера видео:

    func compress(fileName:String,videoPath : String, exportVideoPath : String, completion : @escaping (Bool) -> ()) {

        let videoUrl = URL(fileURLWithPath: videoPath)
        let videoAssetUrl = AVURLAsset(url: videoUrl)
        let videoTrackArray = videoAssetUrl.tracks(withMediaType: AVMediaTypeVideo)

        if videoTrackArray.count < 1 {
          completion(false)
          return
        }
        let videoAssetTrack = videoTrackArray[0]
        let audioTrackArray = videoAssetUrl.tracks(withMediaType: AVMediaTypeAudio)

        if audioTrackArray.count < 1 {
          completion(false)
          return
        }
        let outputUrl = URL(fileURLWithPath: exportVideoPath)
        var videoWriter = try? AVAssetWriter(url: outputUrl, fileType: AVFileTypeQuickTimeMovie)
        videoWriter?.shouldOptimizeForNetworkUse = true

        let vSetting = videoSettings(size: renderSize)
        let videoWriterInput = AVAssetWriterInput(mediaType: AVMediaTypeVideo, outputSettings: vSetting)
        videoWriterInput.expectsMediaDataInRealTime = false
        videoWriterInput.transform = videoAssetTrack.preferredTransform
        videoWriter?.add(videoWriterInput)


        let videoReaderSettings:[String : AnyObject] = [
          kCVPixelBufferPixelFormatTypeKey as String: Int(kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange) as AnyObject
        ]
        let videoReaderOutput = AVAssetReaderTrackOutput(track: videoAssetTrack, outputSettings: videoReaderSettings)
        let videoReader = try! AVAssetReader(asset: videoAssetUrl)
        videoReader.add(videoReaderOutput)
        videoWriter?.startWriting()
        videoReader.startReading()
        videoWriter?.startSession(atSourceTime: kCMTimeZero)

        let processingVideoQueue = DispatchQueue(label: "processingVideoCompressionQueue")
        videoWriterInput.requestMediaDataWhenReady(on: processingVideoQueue, using: {
          while(videoWriterInput.isReadyForMoreMediaData){
            let sampleVideoBuffer = videoReaderOutput.copyNextSampleBuffer()
            if (videoReader.status == .reading && sampleVideoBuffer != nil) {
              videoWriterInput.append(sampleVideoBuffer!)
            }else {
              videoWriterInput.markAsFinished()
              if (videoReader.status == .completed) {

                videoWriter?.finishWriting(completionHandler: {
                  videoWriter = nil
                  self.export = true
                  completion(true)

                })
              }
            }
            if self.export {
              break
            }
          }
        })
      }

 func videoSettings() -> [String : AnyObject] {

    var compressionSettings = [String : AnyObject]()
    //    compressionSettings[AVVideoAverageBitRateKey] = 425000
    compressionSettings[AVVideoAverageBitRateKey] = 1 as AnyObject
    compressionSettings[AVVideoProfileLevelKey] = AVVideoProfileLevelH264Main30 as AnyObject;
    compressionSettings[AVVideoMaxKeyFrameIntervalKey] = 1 as AnyObject
    var settings = [String : AnyObject]()
    settings[AVVideoCompressionPropertiesKey] = compressionSettings as AnyObject
    settings[AVVideoCodecKey] = AVVideoCodecH264 as AnyObject?
    settings[AVVideoHeightKey] = 500 as AnyObject?
    settings[AVVideoWidthKey] = 720 as AnyObject?

    return settings
  }

func getFileSize() {
    var fileSize : UInt64
    do {
      let attr:NSDictionary? = try FileManager.default.attributesOfItem(atPath: path) as NSDictionary
    if let _attr = attr {
      fileSize = _attr.fileSize();
      print(fileSize)
      var sizeMB = Double(fileSize / 1024)
      sizeMB = Double(sizeMB / 1024)
      print(String(format: "%.2f", sizeMB) + " MB")
      if sizeMB > 25 {
        showVideoWrongSizeAlert()
        return
      }
    }
    }catch {
      print(error.localizedDescription)
    }
...