Comment diviser un fichier audio en plusieurs?

36

J'ai trouvé quelque chose pour les vidéos, qui ressemble à ceci.

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

J'ai essayé d'utiliser cela pour un fichier audio, mais seul le premier fichier audio contenait de l'audio réel, les autres étaient silencieux. À part ça, c'était bon, cela créait un nouveau fichier audio à chaque seconde. Est-ce que quelqu'un sait quoi modifier pour que cela fonctionne avec des fichiers audio, ou une autre commande qui peut faire la même chose?

Afficher un nom
la source
Si vous souhaitez d’autres moyens de le faire, veuillez expliquer plus en détail ce que vous essayez d’atteindre. Les lignes de commande ffmpeg sont difficiles à retenir.
1
@siblynx Comme je l'ai expliqué dans la question, divisez chaque seconde d'un fichier audio en nouveaux fichiers audio.
DisplayName

Réponses:

52

Cela a fonctionné pour moi lorsque je l'ai essayé sur un fichier mp3.

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

-segment_timeest la quantité de temps que vous souhaitez pour chaque fichier (en secondes).

Les références

slm
la source
A travaillé sur des mp3 . Échec pour moi sur m4b : " Flux audio non valide. Un seul flux audio MP3 est requis."
vossad01
FYI, remplace mp3parm4a
Mikhail
Qu'en est-il du cas où j'ai un fichier de 40 minutes dans lequel j'aimerais entrer, disons, de 4 minutes, 6 minutes, 12 minutes, 8 minutes, 10 minutes au lieu de la fragmentation en sous-fichiers uniformes?
isosceleswheel
@isosceleswheel - jetez un coup d'œil à ceci - unix.stackexchange.com/questions/94168/… .
slm
Cela a également fonctionné pour les fichiers wav.
Mário Meyrelles
19

Pour diviser un gros fichier audio en un ensemble de pistes de différentes longueurs, vous pouvez utiliser la commande suivante:

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

Par exemple, j'ai scindé un fichier .opus unique de Inception Original Soundtrack en sous-fichiers à l'aide de ce fichier texte contenant les noms de début, de fin et de nom:

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

J'ai écrit ce court awkprogramme pour lire le fichier texte et créer des ffmpegcommandes à partir de chaque ligne:

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

Voici une pythonversion plus détaillée du programme appelée split.py, où le fichier de piste original et le fichier texte spécifiant des sous-pistes sont lus à partir de la ligne de commande:

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

Vous pouvez facilement créer des ffmpegappels de plus en plus complexes en modifiant le modèle de commande et / ou en ajoutant davantage de champs à chaque ligne du fichier track_list.

roue isocèle
la source
c'est fantastique, ! s'il vous plaît dites-moi comment exécuter cela à partir d'un programme python, c'est-à-dire que je veux lire l'audio et le fichier d'annotation avec début, fin, étiquette. puis divisez l'audio en morceaux dont la taille correspond à chaque ligne du fichier.
kRazzy R
2
@kRazzyR subprocess.call(command)est l’ entrée pythonanalogique system(command)in awk, qui vous permet d’envoyer des ffmpegcommandes au shell. J'ai édité mon message pour inclure une pythonimplémentation flexible illustrant une façon de procéder.
isosceleswheel
1
D'après mon expérience, l'heure de début de la piste n ° 2 devrait être égale à l'heure de fin de la piste n ° 1, et ainsi de suite. C'est-à-dire que vos temps d'exemple passeront une seconde entre chaque piste.
Tim Smith
1
Voici une version compacte bash / zsh. Modifiez les heures selon vos besoins, puis supprimez le mot echo pour exécuter les commandes. 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 merci de l'avoir capturé, j'ai ajouté une modification ci-dessus. Selon votre lecteur, il peut encore y avoir un petit hoquet entre les pistes mais cela sonne certainement mieux que de couper les 1.
isosceleswheel
3

La ligne suivante divisera un fichier audio en plusieurs fichiers d'une durée de 30 secondes chacun.

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

Remplacez 30 (le nombre de secondes) par le nombre de votre choix.

Stryker
la source
1

la réponse de slm :

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

ne fonctionnerait pas pour moi sans l' -map 0ajout:

ffmpeg -i somefile.mp3 -map 0 -f segment -segment_time 3 -c copy out%03d.mp3
Sans racine
la source
Le mappage fonctionne très bien, mais ajoutez également -vn pour supprimer toutes les images incorporées, ou il tentera de recréer l'image pour chaque segment (sloooowww).
Chris Reid le
1

La solution proposée n'a pas fonctionné pour moi. Je pense que cela est dû à une ancienne version de ffmpegmon système.
Dans tous les cas, je voulais proposer une solution qui me convienne. Vous pouvez également personnaliser les minuteries de manière à permettre le chevauchement de l'audio si vous le souhaitez.

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

divisez vos fichiers audio en incréments de 30 secondes

tisaconundrum
la source
Une nouvelle question serait recevable, car cela ne répond pas à la question de OP!
George Udosen le