Замедленное видео с аудио с использованием кадрового подхода - iOS - PullRequest
0 голосов
/ 28 апреля 2020

Я должен конвертировать видео в замедленное движение со звуком, используя базовый подход. Следующие ссылки были очень полезны: Reverse-AVAsset-Efficient

В решении я могу изменить временную метку буфера и добиться замедленного видео.

for sample in videoSamples {
   var presentationTime = CMSampleBufferGetPresentationTimeStamp(sample)

   //Changing Timestamp to achieve slow-motion 
   presentationTime.timescale = presentationTime.timescale * 2

   let imageBufferRef = CMSampleBufferGetImageBuffer(sample)
   while !videoWriterInput.isReadyForMoreMediaData {
     Thread.sleep(forTimeInterval: 0.1)
   }
   pixelBufferAdaptor.append(imageBufferRef!, withPresentationTime: presentationTime)
}

для замедленного воспроизведения звука я попытался изменить временную метку аудиосэмпла, но это не дало эффекта.

Есть ли какое-либо решение для замедленного воспроизведения звука.

Если у вас есть решение Objective- C, не стесняйтесь его опубликовать. Спасибо.

Ответы [ 2 ]

1 голос
/ 28 апреля 2020

В зависимости от того, как вы хотите, чтобы звук звучал, вы можете попробовать вручную ввести один из аудиоустройств Apple с шагом звука с данными аудиосэмпла, чтобы изменить его длину в соответствии с временем между вашими новыми метками времени.

0 голосов
/ 08 мая 2020

Вы можете сделать легкое замедленное движение, используя AVMutableComposition. Как упомянул @ hotpaw2, есть несколько способов замедлить звук - например, вы можете уменьшить высоту звука или сохранить его постоянным. Это решение кажется постоянным, и я не вижу способа изменить это. Может быть, это то, что вы хотите. Возможно, нет.

Вы можете использовать AVAssetExportSession для записи медленного видео в файл, а поскольку AVMutableComposition является (возможно удивительно) подклассом AVAsset, вы можете просмотреть результаты, используя AVPlayer, даже если Вы не экспортировали замедленную версию видео.

let asset = AVURLAsset(url: Bundle.main.url(forResource: "video", withExtension: "mp4")! , options : nil)

let srcVideoTrack = asset.tracks(withMediaType: .video).first!
let srcAudioTrack = asset.tracks(withMediaType: .audio).first!

let sloMoComposition = AVMutableComposition()
let sloMoVideoTrack = sloMoComposition.addMutableTrack(withMediaType: .video, preferredTrackID: kCMPersistentTrackID_Invalid)!
let sloMoAudioTrack = sloMoComposition.addMutableTrack(withMediaType: .audio, preferredTrackID: kCMPersistentTrackID_Invalid)!

let assetTimeRange = CMTimeRange(start: .zero, duration: asset.duration)

try! sloMoVideoTrack.insertTimeRange(assetTimeRange, of: srcVideoTrack, at: .zero)
try! sloMoAudioTrack.insertTimeRange(assetTimeRange, of: srcAudioTrack, at: .zero)

let newDuration = CMTimeMultiplyByFloat64(assetTimeRange.duration, multiplier: 2)
sloMoVideoTrack.scaleTimeRange(assetTimeRange, toDuration: newDuration)
sloMoAudioTrack.scaleTimeRange(assetTimeRange, toDuration: newDuration)

// Export to a file using AVAssetExportSession
let exportSession = AVAssetExportSession(asset: sloMoComposition, presetName: AVAssetExportPresetPassthrough)!
exportSession.outputFileType = .mp4
exportSession.outputURL = getDocumentsDirectory().appendingPathComponent("slow-mo-\(Date.timeIntervalSinceReferenceDate).mp4")
exportSession.exportAsynchronously {
    assert(exportSession.status == .completed)
    print("File in \(exportSession.outputURL!)")
}
...