Jak podzielić plik audio na wiele?


36

Znalazłem coś do filmów, które wyglądają tak.

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

Próbowałem użyć tego do pliku audio, ale tylko pierwszy plik audio zawierał rzeczywisty dźwięk, inne milczały, poza tym, że było dobre, tworzył nowy plik audio na każdą sekundę. Czy ktoś wie, co zmodyfikować, aby działało z plikami audio lub innym poleceniem, które może zrobić to samo?


Jeśli chcesz to zrobić w inny sposób, wyjaśnij bardziej szczegółowo, co próbujesz osiągnąć. cmdlines ffmpeg są trudne do zapamiętania.

1
@siblynx Jak wyjaśniłem w pytaniu, dziel każdą sekundę pliku audio na nowe pliki audio.
DisplayName

Odpowiedzi:


52

To działało dla mnie, gdy próbowałem go na pliku mp3.

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

Gdzie -segment_timejest czas, jaki chcesz na każdy plik (w sekundach).

Referencje


Pracował na mp3 s. Dla mnie m4b nie powiodło się, mówiąc: „Nieprawidłowy strumień audio. Wymagany jest dokładnie jeden strumień audio MP3”.
vossad01

FYI, wymienić mp3zm4a
Michaił

Co z przypadkiem, w którym mam plik 40-minutowy, na który chciałbym się włamać, powiedzmy 4 minuty, 6 minut, 12 minut, 8 minut, 10 minut zamiast rozbicia na jednolite pod-pliki?
isosceleswheel

@isosceleswheel - spójrz na to - unix.stackexchange.com/questions/94168/… .
slm

Działa również w przypadku plików wav.
Mário Meyrelles,

19

Aby podzielić duży plik audio na zestaw ścieżek o różnych długościach, możesz użyć następującego polecenia:

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

Na przykład podzieliłem pojedynczy plik .opus oryginalnej ścieżki dźwiękowej Inception na pod-pliki przy użyciu tego pliku tekstowego zawierającego początek, koniec, nazwę:

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

Napisałem ten krótki awkprogram do odczytu pliku tekstowego i tworzenia ffmpegpoleceń z każdej linii:

{
    # 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)
}

Oto bardziej szczegółowa pythonwersja programu o nazwie split.py, w której teraz zarówno oryginalny plik ścieżki, jak i plik tekstowy określający ścieżki podrzędne są odczytywane z wiersza poleceń:

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()

Możesz łatwo tworzyć coraz bardziej skomplikowane ffmpegwywołania, modyfikując szablon poleceń i / lub dodając więcej pól do każdej linii pliku track_list.


to jest fantastyczne, ! proszę powiedz mi, jak uruchomić to z programu python, tzn. chcę odczytać dźwięk i plik adnotacji z etykietą start, koniec i etykieta. a następnie podziel audio na kawałki o rozmiarach odpowiadających każdej linii w pliku.
kRazzy R

2
@kRazzyR subprocess.call(command)jest pythonanalogowo system(command)w awk, z których oba umożliwiają wysyłanie ffmpegpoleceń powłoki. Zredagowałem swój post, aby uwzględnić elastyczną pythonimplementację ilustrującą jeden ze sposobów, w jaki możesz to zrobić.
isosceleswheel

1
Z mojego doświadczenia wynika, że ​​czas rozpoczęcia ścieżki nr 2 powinien być równy czasowi zakończenia ścieżki nr 1 i tak dalej. To znaczy, twoje przykładowe czasy przeskoczą o sekundę między każdą ścieżką.
Tim Smith

1
Oto kompaktowa wersja bash / zsh. W razie potrzeby edytuj czasy, a następnie usuń słowo, echo aby faktycznie uruchomić polecenia. 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
Tim Smith

@TimSmith dzięki za złapanie tego, dodałem powyższą edycję. W zależności od odtwarzacza może występować niewielka czkawka między utworami, ale zdecydowanie brzmi to lepiej niż wycinanie 1s.
isosceleswheel

3

Następująca linia podzieli plik audio na wiele plików, każdy o czasie trwania 30 sekund.

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

Zmień 30 (czyli liczbę sekund) na dowolną liczbę, którą chcesz.


1

odpowiedź SLM :

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

nie działałoby dla mnie bez -map 0dodanego:

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

Mapowanie działa świetnie, ale dodaje także opcję -vn, aby usunąć osadzone obrazy lub spróbuje odtworzyć obraz dla każdego segmentu (sloooowww).
Chris Reid

1

Podane rozwiązanie nie działało dla mnie. Uważam, że jest to spowodowane starszą wersją ffmpegmojego systemu.
W każdym razie chciałem zapewnić rozwiązanie, które zadziałało dla mnie. Możesz również dostosować timery, aby umożliwić nakładanie się na dźwięk, jeśli chcesz.

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

podziel pliki audio na 30-sekundowe przyrosty


Nowe pytanie byłoby właściwe, ponieważ nie odpowiada na pytanie OP!
George Udosen
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.