web-dev-qa-db-fra.com

Comment diviser un fichier audio en plusieurs?

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é de l'utiliser pour un fichier audio, mais seul le premier fichier audio contenait de l'audio réel, les autres étaient silencieux, à part que c'était bon, il faisait un nouveau fichier audio pour chaque seconde. Quelqu'un sait-il quoi modifier pour que cela fonctionne avec des fichiers audio, ou une autre commande qui peut faire la même chose?

37
DisplayName

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

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

-segment_time est la durée souhaitée pour chaque fichier (en secondes).

Références

54
slm

Pour diviser un gros fichier audio en un ensemble de pistes de longueurs variables, 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 divisé un seul fichier .opus de la bande originale Inception en sous-fichiers en utilisant ce fichier texte contenant début, fin, 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 programme awk pour lire le fichier texte et créer des commandes ffmpeg à 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 version python plus détaillée du programme appelé split.py, où maintenant le fichier de piste d'origine et le fichier texte spécifiant les sous-pistes est lu à 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 appels ffmpeg de plus en plus compliqués en modifiant le modèle de commande et/ou en ajoutant plus de champs à chaque ligne du fichier track_list.

25
isosceleswheel

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 (qui est le nombre de secondes) par le nombre de votre choix.

3
Stryker

réponse de slm :

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

ne fonctionnerait pas pour moi sans le -map 0 ajoutée:

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

La solution donnée n'a pas fonctionné pour moi. Je pense que cela est dû à une ancienne version de ffmpeg sur mon système.
Dans tous les cas, je voulais fournir une solution qui fonctionnait pour moi. Vous pouvez également personnaliser les minuteries afin de 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

1
tisaconundrum