Как обрезать первые 8 секунд и последние 8 секунд с начала, а затем с конца аудиофайла m4a и сохранить остальную часть файла

Проблема в том, что вы выполняете другую ветвь в подоболочке (, что означает скобки -, например. на справочной странице bash(1)найдите compound commands)-, поэтому exitвыходит из подоболочки, а не из оболочки, выполняющей скрипт. Чтобы увидеть это более графически, поместите достаточно длинный sleepв обе версии вашего кода и запуститеps faux(для coreutilsверсииps)или что-то вроде pstree, чтобы увидеть отношения предков процесса.

Теперь, как это "исправить":

  1. в if... then / else / fiнет ничего плохого. Особенно для более длинных блоков это делает код более читаемым.

  2. если вы хотите один лайнер, то вы можете сделать

    [ "$?" -eq 0 ] && echo "OK" || echo "NOK" >&2 && exit 1
    

    , который полагается на корректное завершение эха, или используйте групповую команду

    [ "$?" -eq 0 ] && echo "OK" || { echo "NOK" >&2 ; exit 1; }
    

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

  3. наиболее полный -пример использования обработчика сигнала/события(bashсинтаксис для других оболочек может отличаться):

    #!/bin/bash
    
    exit_handler () {
        echo "error happened, exiting"
       ... fix things, that may be half baked...
    }
    
    trap exit_handler EXIT
    
    ... do stuff...
    

    Это дает вам возможность:

    • использование set -e(set -o errexit), которое часто считается опасным -обработчик EXITможет делать такие вещи, как удаление любых временных файлов, которые вы не хотите оставлять
    • иметь код очистки только в одном месте
    • обрабатывать другие сигналы (отправленные, например.kill)а также
1
16.03.2021, 21:26
2 ответа

Это удалит первые 8 секунд из начала файла без повторного -кодирования и сохранит все, кроме первых 8 секунд, в выходном файле

ffmpeg -ss 8 -i in_file.m4a -c copy out_file.m4a

Кроме того, в строке ниже будут обрезаны последние 8 секунд с конца аудиофайла. Строка ниже кажется запутанной, но это самое простое решение, которое я мог видеть, которое обрезает конец файла:

ffmpeg -i in_file.m4a -ss 8 -i in_file.m4a -c copy -map 1:0 -map 0 -shortest -f nut - | ffmpeg -y -f nut -i - -map 0 -map -0:0 -c copy out_file.m4a
2
18.03.2021, 22:25

Как и ffmpeg, вы также можете использовать SoX, который больше предназначен для аудио, но вам сначала нужно будет преобразовать аудиофайл в wav или mp3, я думаю, поскольку SoX не работает с m4a.

ffmpeg -i input.m4a output.wav

После установки SoX

sudo apt-get install sox
sox input.wav output.wav trim 8 -8

Похоже на то, что если вы просто хотите удалить тихие части, вы также можете использовать для этого Librosa.

Для использования формата m4a с Librosa вам необходимо установить ffmpeg и GStreamer, например, на Debian/Ubuntu:

sudo apt install libgstreamer1.0-0 

sudo apt install ffmpeg

Тогда в питоне вы можете использовать:

import librosa 
y, sr = librosa.core.load(m4a_audio_file, sr=16000)
yt, index = librosa.effects.trim(y)
original_duration= librosa.get_duration(y)
new_duration = librosa.get_duration(yt)
1
19.03.2021, 10:35

Теги

Похожие вопросы