オーディオファイルを複数に分割するにはどうすればよいですか?


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コマンドラインは覚えにくいです。

1
@siblynx質問で説明したように、オーディオファイルの1秒ごとを新しいオーディオファイルに分割します。
-DisplayName

回答:


52

mp3ファイルで試してみたところ、これでうまくいきました。

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

どこで-segment_timeあなたは(秒)各ファイルごとたい時間の量です。

参照資料


従事mp3秒。m4bで「無効なオーディオストリーム。MP3オーディオストリームが1つだけ必要です」と言って失敗しました。
vossad01

参考までにmp3m4a
ミハイル

たとえば、4分、6分、12分、8分、10分など、均一なサブファイルに分割したい40分ファイルがある場合はどうでしょうか。
isosceleswheel

@isosceleswheel -このを見てみましょう- unix.stackexchange.com/questions/94168/...を
slm

また、wavファイルでも機能しました。
マリオメレレス

19

大きなオーディオファイルをさまざまな長さのトラックセットに分割するには、次のコマンドを使用できます。

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

たとえば、開始、終了、名前を含む次のテキストファイルを使用して、Inception Original Soundtrackの単一の.opusファイルをサブファイルに分割しました。

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)はin にpython類似してsystem(command)おりawk、どちらもffmpegシェルにコマンドを送信できます。投稿を編集して、pythonこれを実現する1つの方法を示す柔軟な実装を含めました。
isosceleswheel

1
私の経験では、トラック#2の開始時間はトラック#1の終了時間と等しくなければなりません。つまり、サンプル時間は各トラック間で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秒単位に分割します


これはOPの質問に答えないので、新しい質問が順番になります!
ジョージウドセン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.