Как прочитать первые и последние 64 КБ видеофайла в Swift

Я хочу использовать API субтитров. Для этого требуется хэш md5 первых и последних 64 КБ видеофайла. Я знаю, как сделать часть md5, просто хочу знать, как мне получить 128 КБ данных.

Вот решение проблемы в Java, которую я не могу реализовать в Swift. Стек

У меня есть URL-адрес видео. Как мне получить из него первые и последние 64 КБ? Подключиться к AlamoFire и что?

ниже показано, как это делается в Java,

FileInputStream in = new FileInputStream("d:/1.avi");
byte[] a = new byte[64 * 1024];
in.read(a);   //head
long p = in.getChannel().size() - 64 * 1024;
in.getChannel().position(p);
in.read(a);   //tail

person alemac852    schedule 03.05.2017    source источник


Ответы (1)


Вот как это сделать правильно:

let data = try! Data(contentsOf: URL(string: <#Insert your URL#>)!) // should do some unwrapping precautions here

// first 64 bytes
let first = data.subdata(in: 0 ..< 65336) // 65336 bytes = 1kb (if 1kb = 1024 bytes)

// last 64 bytes
let last = data.subdata(in: (data.count - 65336)..<data.count) // data.count - 65366 = last 64 bytes of the file

Итак, сначала вы загружаете файл (например, с помощью Alamofire). Как только это будет сделано, поместите URL-адрес в параметр string: инициализатора URL.

Затем используйте переменные first и last, чтобы получить файл md5.

person paper1111    schedule 03.05.2017
comment
Спасибо! очень полезно! Зачем мне скачивать файл thesubdb.com/api/samples/dexter.mp4 с Alamofire, когда есть эти данные (contentsOf: URL (string: ‹#Insert your URL#›)!) и я мог бы просто поместить туда эту строку URL. - person alemac852; 04.05.2017
comment
Ну, на самом деле, если вы просто разместите ссылку, вам придется выполнить несколько потоков, потому что ваше приложение зависнет, пока загружает файл. Он будет убит iOS, если он зависнет на долгое время. - person paper1111; 04.05.2017
comment
ах да, у меня сейчас такая проблема. так как я помещаю 2-часовые URL-адреса видео в Data(contentsOf: URL(string: ‹#Insert your URL#›)!) Хм, есть ли способ просто загрузить первый и последний биты видео? затем получите первый и последний биты этих данных (64 байта). затем найдите хэш-код (сохранение устройства для загрузки всего видео только для запроса API субтитров на получение?), пытаясь придумать лучший подход. - person alemac852; 04.05.2017
comment
с помощью аламо огненное мяу - person alemac852; 04.05.2017
comment
Разве 65336 не должно быть 64000? или это потому что апи сказал 64*1024 - person alemac852; 04.05.2017
comment
API указывает 64 * 1024, поэтому просто используйте 64 * 1024. - person paper1111; 04.05.2017
comment
И я не думаю, что можно скачивать только части видео - person paper1111; 04.05.2017