Как воспроизвести файл, сохраненный на внешнем устройстве внутри iOS AVPlayer? - PullRequest
0 голосов
/ 19 марта 2019

Я использую стороннюю библиотеку для извлечения видеофайла, сохраненного на внешнем устройстве памяти.Приведенный ниже код показывает, как я читаю ВЕСЬ файл в память перед его открытием:

    // sessionController is a class from the third party library
    let handle: UInt64 = self.sessionController.openFile(file.path, mode: openMode)
    if handle == 0 {
        //This is an error
        return
    }

    //Instantiate a buffer array of the proper size
    let c = file.size
    var bytesArray: [UInt8] = [UInt8](fileData)
    let bufferPointer: UnsafeMutablePointer<UInt8> = UnsafeMutablePointer<UInt8>.allocate(capacity: Int(c))
    bufferPointer.initialize(from: bytesArray, count: Int(c))

    //Deinit and deallocate the memory when I'm done with it
    defer {
        bufferPointer.deinitialize(count: Int(c))
        bufferPointer.deallocate()
    }

    var sum: UInt32 = 0
    let singleSize: UInt32 = 8 << 20

    while sum < c {
        let read = self.sessionController.readFile(handle, data: bufferPointer, len: singleSize)
        if read == 0 {
            //This is an error
            return
        }
        sum += read
    }

    let newPointer : UnsafeRawPointer = UnsafeRawPointer(bufferPointer)

    fileData = Data(bytes: newPointer, count: Int(c))

Как только у меня есть объект данных, я могу делать с ним все, что мне нужно.Это прекрасно работает для небольших файлов.Тем не менее, я хотел бы воспроизвести видео с внешнего устройства.Они могут быть размером в ГБ.Я хотел бы как-то получить что-то вроде этого:

    AVPlayer(init: URL)

Ясно, что класс AVPlayer каким-то образом обрабатывает загрузку памяти с учетом URL файла.Как я могу сделать что-то подобное в моем коде?В стороннем SDK доступны следующие методы работы с файлами:

//OpenFile returns a handle for use in the methods below
OpenFile(fileName: String, mode: UnsafeMutablePointer<UInt8>)
ReadFile(handle: UInt64, data: UnsafeMutablePointer<UInt8>, len: UInt32)
WriteFile(handle: UInt64, data: UnsafeMutablePointer<UInt8>, len: UInt32) 
Seek(handle: UInt64, offset: Int64, base: Int32)

Я знаю, что между небезопасными указателями памяти и URL-адресами существует довольно большой разрыв, но я не уверен, с чего начать.Спасибо!

...