Вот как я бы подошел к этому, используя 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()
, чтобы проверить, где это).