Як розділити звуковий файл на кілька?


36

Я знайшов щось для відео, яке виглядає приблизно так.

ffmpeg -i * -c:v libx264 -crf 22 -map 0 -segment_time 1 -g 1 -sc_threshold 0 -force_key_frames "expr:gte(t,n_forced*9)" -f segment output%03d.mp4

Я спробував використовувати це для аудіофайлу, але лише перший аудіофайл містив фактичне аудіо, інші мовчали, окрім того, що це було добре, він створював новий аудіофайл щосекунди. Хтось знає, що змінити, щоб зробити цю роботу з аудіофайлами, або іншою командою, яка може зробити те саме?


Якщо ви хочете інших способів зробити це, то, будь ласка, поясніть більш докладно, чого ви намагаєтесь досягти. ffmpeg cmdlines важко запам'ятати.

1
@siblynx Як я пояснював у запитанні, розділіть кожну секунду аудіофайлу на нові аудіофайли.
DisplayName

Відповіді:


52

Це працювало для мене, коли я спробував це на mp3-файлі.

$ ffmpeg -i somefile.mp3 -f segment -segment_time 3 -c copy out%03d.mp3

Де -segment_timeпотрібна кількість часу на кожен файл (у секундах).

Список літератури


Працював над mp3 s. Не вдалося мені сказати : "Недійсний аудіопотік. Потрібен рівно один аудіопотік у форматі MP3".
vossad01

FYI, замінити mp3наm4a
Михайло

А як щодо випадку, коли у мене є 40-хвилинний файл, який я хотів би розбити, скажімо, 4min, 6min, 12min, 8min, 10min замість того, щоб розбитись на рівномірні під-файли?
isosceleswheel

@isosceleswheel - погляньте на це - unix.stackexchange.com/questions/94168/… .
slm

Він також працював для файлів WAV.
Mário Meyrelles

19

Щоб розділити великий аудіофайл на набір треків різної довжини, ви можете скористатися такою командою:

# -to is the end time of the sub-file
ffmpeg -i BIG_FILE -acodec copy -ss START_TIME -to END_TIME LITTLE_FILE

Наприклад, я розбив єдиний.

00:00:00 00:01:11 01_half_remembered_dream
00:01:11 00:03:07 02_we_built_our_own_world
00:03:07 00:05:31 03_dream_is_collapsing
00:05:31 00:09:14 04_radical_notion
00:09:14 00:16:58 05_old_souls
00:16:58 00:19:22 06
00:19:22 00:24:16 07_mombasa
00:24:16 00:26:44 08_one_simple_idea
00:26:44 00:31:49 09_dream_within_a_dream
00:31:49 00:41:19 10_waiting_for_a_train
00:41:19 00:44:44 11_paradox
00:44:44 00:49:20 12_time

Я написав цю коротку awkпрограму, щоб прочитати текстовий файл і створити ffmpegкоманди з кожного рядка:

{
    # make ffmpeg command string using sprintf
    cmd = sprintf("ffmpeg -i inception_ost.opus -acodec copy -ss %s -to %s %s.opus", $1, $2, $3)

    # execute ffmpeg command with awk's system function
    system(cmd)
}

Ось більш детальна pythonверсія програми під назвою split.py, де зараз з командного рядка читаються як вихідний файл треку, так і текстовий файл із зазначенням субдоріжок:

import subprocess
import sys


def main():
    """split a music track into specified sub-tracks by calling ffmpeg from the shell"""

    # check command line for original file and track list file
    if len(sys.argv) != 3:
        print 'usage: split <original_track> <track_list>'
        exit(1)

    # record command line args
    original_track = sys.argv[1]
    track_list = sys.argv[2]

    # create a template of the ffmpeg call in advance
    cmd_string = 'ffmpeg -i {tr} -acodec copy -ss {st} -to {en} {nm}.opus'

    # read each line of the track list and split into start, end, name
    with open(track_list, 'r') as f:
        for line in f:
            # skip comment and empty lines
            if line.startswith('#') or len(line) <= 1:
                continue

            # create command string for a given track
            start, end, name = line.strip().split()
            command = cmd_string.format(tr=original_track, st=start, en=end, nm=name)

            # use subprocess to execute the command in the shell
            subprocess.call(command, shell=True)

    return None


if __name__ == '__main__':
    main()

Ви можете легко створити більш складні ffmpegдзвінки, змінивши шаблон команди та / або додавши більше полів до кожного рядка файла track_list.


це фантастично,! скажіть, будь ласка, як запустити це з програми python, тобто я хочу прочитати аудіо та файл приміток із початком, кінцем, міткою. а потім розділіть аудіо на частини, розміри яких відповідають кожному рядку у файлі.
kRazzy R

2
@kRazzyR subprocess.call(command)є pythonаналогом system(command)в awk, обидва вони дозволяють надсилати ffmpegкоманди оболонки. Я відредагував свою публікацію, щоб включити гнучку pythonреалізацію, що ілюструє один із способів, як ви могли це зробити.
isosceleswheel

1
На мій досвід, час початку треку №2 повинен дорівнювати часу закінчення треку №1 тощо. Тобто, ваші приклади разів пропустить секунду між кожною доріжкою.
Тім Сміт

1
Ось компактна версія bash / zsh. Відредагуйте потрібні рази, а потім видаліть слово, echo щоб фактично виконати команди. source="source audio file.m4a"; i=0; t1=0:00; for end_time in 1:24 5:40 14:48 19:33 35:11 40:00 46:08 51:58 ''; do i=$((i+1)); t0=$t1 t1=$end_time; echo ffmpeg -i "$source" -acodec copy -ss $t0 ${t1:+-to} $t1 $(printf "track%02d.%s" $i ${source##*.}); done
Тім Сміт

@TimSmith дякую за те, що я це зрозумів, я додав редагування вище. Залежно від вашого гравця, все ще може бути невеликий гикавки між треками, але це, безумовно, звучить краще, ніж відсікання 1 секунди.
isosceleswheel

3

Наступний рядок розділить аудіофайл на кілька файлів, тривалістю 30 секунд.

ffmpeg -i file.wav -f segment -segment_time 30 -c copy parts/output%09d.wav

Змініть 30 (тобто кількість секунд) на будь-яке число, яке ви хочете.


1

відповідь slm :

ffmpeg -i somefile.mp3  -f segment -segment_time 3 -c copy out%03d.mp3

не буде працювати для мене із -map 0доданими:

ffmpeg -i somefile.mp3 -map 0 -f segment -segment_time 3 -c copy out%03d.mp3

Відображення чудово працює, але також додайте -vn, щоб викреслити будь-які вбудовані зображення, або воно спробує відтворити зображення для кожного сегмента, (sloooowww).
Кріс Рейд

1

Дане рішення для мене не спрацювало. Я вважаю, що це пов'язано зі старішою версією ffmpegмоєї системи.
У будь-якому випадку, я хотів надати рішення, яке для мене спрацювало. Ви також можете налаштувати таймери, щоб дозволити перекриття звуку, якщо хочете.

Output file #0 does not contain any stream

ffmpeg -i your_audio_file.mp3 -acodec copy -t 00:00:30 -ss 00:00:00 split_audio_file.mp3

розділіть аудіофайли на кроки 30 секунд


Нове запитання було б на порядку, оскільки це не відповідає на питання ОП!
Джордж Удосен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.