Как разделить файлы WAVE объемом 8 ГБ (продолжительностью 24 часа) на файлы меньшего размера (продолжительностью 1 час) в R?

#r #audio #wav

#r #Аудио #wav

Вопрос:

Я хотел бы разделить 8 ГБ (продолжительностью 24 часа) Файлы WAVE на файлы меньшего размера (продолжительностью 1 час). У меня есть около 800 больших файлов для разделения, поэтому я не мог сделать это вручную.

Я пытаюсь использовать пакеты: tuneR, seewave и phonTools. Ниже приведен фрагмент моего скрипта на R:

 example1=readWave("example.wav", from=0, to=1, units= "hours")
savewav(example1,f=48000)

example2=readWave("example.wav", from=22, to=23, units= "hours")
savewav(example2,f=48000)
  

Когда я запускал пример 1, все было правильно. Я получил ВОЛНОВОЙ файл продолжительностью один час.
Проблема заключается в разделении файлов объемом 8 ГБ в последующие часы, как в примере 2. Я получаю комментарий в консоли: readBin(con, int, n = N, size = байты, signed = (байты! = 1), ‘: недопустимый аргумент ‘n’.

Вероятно, у R проблема с размером этого файла, который слишком велик, потому что WAVE ограничен 4 ГБ. Я уверен, что этот файл включает в себя все 24 часа записи, потому что я меняю файл с WAVE на FLACK в аудиопрограмме Audacity, и все данные были там.

Есть какое-либо другое решение для размещения такого большого файла в R?

Ответ №1:

Используйте ffmpeg:

 ffmpeg -i example.wav -f segment -segment_time 3600 -c copy out%03d.wav
  

Ссылка: https://www.ffmpeg.org/ffmpeg-formats.html#segment_002c-stream_005fsegment_002c-ssegment

Комментарии:

1. Я думаю, что это тоже был бы правильный путь. ffmpeg гораздо лучше подходит для такого рода задач. Если OP хочет использовать его из R, они всегда могут использовать system() . Они также могут использоваться sox следующим образом: sox example.wav out.wav trim 0 3600 : newfile : restart . 1

2. Спасибо. Когда я использовал ваш код, программа создала только 12 файлов (менее 4 ГБ). Но когда я добавляю дополнительную информацию в код, все было правильно. Я использую следующий код: D:Desktopffmpegbin>ffmpeg -f s16le -ar 48000 -i example.wav -f segment -segment_time 3600 -c copy outd.wav .