Come posso dividere un file audio in più?


36

Ho trovato qualcosa per i video, che assomiglia a questo.

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

Ho provato a usarlo per un file audio, ma solo il primo file audio conteneva audio reale, gli altri erano silenziosi, a parte questo era buono, creava un nuovo file audio per ogni secondo. Qualcuno sa cosa modificare per farlo funzionare con file audio o un altro comando che può fare lo stesso?


Se desideri altri modi per farlo, ti preghiamo di spiegare più in dettaglio cosa stai cercando di ottenere. I cmdline di ffmpeg sono difficili da ricordare.

1
@siblynx Come ho spiegato nella domanda, dividere ogni secondo di un file audio in nuovi file audio.
DisplayName

Risposte:


52

Questo ha funzionato per me quando l'ho provato su un file mp3.

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

Dove -segment_timeè la quantità di tempo desiderata per ciascun file (in secondi).

Riferimenti


Ha lavorato su mp3 s. Non sono riuscito su me m4b dicendo: "Flusso audio non valido. È richiesto esattamente un flusso audio MP3."
vossad01,

Cordiali saluti, sostituire mp3conm4a
Mikhail

Che dire di un caso in cui ho un file di 40 minuti in cui mi piacerebbe dividere, diciamo, 4min, 6min, 12min, 8min, 10min invece di suddividere in sotto-file uniformi?
isosceleswheel,

@isosceleswheel - dai un'occhiata a questo - unix.stackexchange.com/questions/94168/… .
slm

Ha funzionato anche per i file wav.
Mário Meyrelles,

19

Per dividere un file audio di grandi dimensioni in una serie di tracce con lunghezze variabili, è possibile utilizzare il comando seguente:

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

Ad esempio, ho suddiviso un singolo file .opus della colonna sonora originale di Inception in sotto-file usando questo file di testo contenente inizio, fine, nome:

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

Ho scritto questo breve awkprogramma per leggere il file di testo e creare ffmpegcomandi da ogni riga:

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

Ecco una pythonversione più dettagliata del programma chiamato split.py, in cui ora sia il file di traccia originale che il file di testo che specifica le sottotracce vengono letti dalla riga di comando:

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

È possibile creare facilmente ffmpegchiamate sempre più complicate modificando il modello di comando e / o aggiungendo più campi a ciascuna riga del file track_list.


è fantastico, ! per favore dimmi come eseguirlo da un programma Python, cioè voglio leggere l'audio e il file di annotazione con inizio, fine, etichetta. e quindi dividere l'audio in pezzi con dimensioni corrispondenti a ciascuna riga del file.
kRazzy R

2
@kRazzyR subprocess.call(command)è l' pythonanalogo di system(command)in awk, entrambi i quali consentono di inviare ffmpegcomandi alla shell. Ho modificato il mio post per includere pythonun'implementazione flessibile che illustra un modo in cui potresti procedere.
isosceleswheel

1
Nella mia esperienza, l'ora di inizio della traccia n. 2 dovrebbe essere uguale all'ora di fine della traccia n. 1 e così via. Cioè, i tempi del tuo esempio salteranno un secondo tra ogni traccia.
Tim Smith,

1
Ecco una versione compatta bash / zsh. Modifica i tempi secondo necessità, quindi rimuovi la parola echo per eseguire effettivamente i comandi. 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 grazie per averlo colto, ho aggiunto una modifica sopra. A seconda del tuo lettore, potrebbe esserci ancora un piccolo singhiozzo tra i brani, ma questo suona sicuramente meglio che tagliare 1s.
isosceleswheel,

3

La riga seguente suddividerà un file audio in più file ciascuno con una durata di 30 secondi.

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

Cambia 30 (che è il numero di secondi) in qualsiasi numero desiderato.


1

la risposta di slm :

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

non funzionerebbe per me senza l' -map 0aggiunta:

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

La mappatura funziona alla grande, ma aggiunge anche -vn per eliminare tutte le immagini incorporate, o proverà a ricreare l'immagine per ogni segmento (sloooowww).
Chris Reid,

1

La soluzione data non ha funzionato per me. Credo che ciò sia dovuto a una versione precedente del ffmpegmio sistema.
In ogni caso, volevo fornire una soluzione che funzionasse per me. Puoi anche personalizzare i timer in modo da consentire la sovrapposizione dell'audio, se lo desideri.

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

dividere i file audio in incrementi di 30 secondi


Una nuova domanda sarebbe in ordine, poiché non risponde alla domanda di OP!
George Udosen,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.