Конкатенация файлов .wav с циклом - PullRequest
2 голосов
/ 30 марта 2020

У меня есть 20 секундные файлы .wav, которые мне нужно объединить для создания файлов продолжительностью 20 минут. У меня есть их в порядке изменения даты, но они не названы особым образом (файлы пришли непосредственно из записей AudioMoth, я могу попытаться переименовать их при необходимости). Я искал способы их объединения, и я могу использовать sox или ffmpeg, однако у меня есть около 15000 файлов, так что это заняло бы слишком много времени вручную. Надеюсь, что это возможно с al oop? Возможно ли это через bash или, может быть, python или R?

1 Ответ

1 голос
/ 31 марта 2020

Вот как я бы подошел к этому, используя R и ffmpeg. Я уверен, что вы можете сделать такой же цикл с bash, но это показалось довольно простым:

combiner <- function(path, segments_per_file) {
  ## Get a list of the wav files
  files <- list.files(path = path, pattern = ".wav", full.names = TRUE)
  ## Split the list of wav files according to the number of files you want to combine at a time
  groups <- cumsum(seq_along(files) %% segments_per_file == 1)
  file_list <- split(files, groups)
  ## Loop through the list and use the concat protocol for ffmpeg to combine the files
  lapply(seq_along(file_list), function(x) {
    a <- tempfile(fileext = ".txt")
    writeLines(sprintf("file '%s'", file_list[[x]]), a)
    system(sprintf('ffmpeg -f concat -safe 0 -i %s -c copy Group_%s.wav', a, x))
  })
}

Если вы предпочитаете использовать sox, то l oop 'sa немного проще:

combiner <- function(path, segments_per_file) {
  files <- list.files(path = path, pattern = ".wav", full.names = TRUE)
  groups <- cumsum(seq_along(files) %% segments_per_file == 1)
  file_list <- split(files, groups)
  lapply(seq_along(file_list), function(x) {
    system(sprintf("sox %s Group_%s.wav", paste(file_list[[x]], collapse = " "), x))
  })
}

В R вы затем запустите combiner(path_to_your_wav_files, 60), если хотите объединить 60 файлов одновременно.

Обратите внимание, что объединенные файлы будут в рабочем каталоге, из которого вы запускаете скрипт (используйте getwd(), чтобы проверить, где это).

...