Bagaimana cara membagi file audio menjadi beberapa?

36

Saya menemukan sesuatu untuk video, yang terlihat seperti ini.

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

Saya mencoba menggunakan itu untuk file audio, tetapi hanya file audio pertama yang berisi audio sebenarnya, yang lain diam, selain itu bagus, itu membuat file audio baru untuk setiap detik. Adakah yang tahu apa yang harus dimodifikasi untuk membuatnya berfungsi dengan file audio, atau perintah lain yang dapat melakukan hal yang sama?

Nama tampilan
sumber
Jika Anda ingin cara lain untuk melakukan ini maka tolong jelaskan secara lebih rinci apa yang ingin Anda capai. cmdline ffmpeg sulit untuk diingat.
1
@siblynx Seperti yang saya jelaskan dalam pertanyaan, pisahkan setiap detik dari file audio menjadi file audio baru.
DisplayName

Jawaban:

52

Ini bekerja untuk saya ketika saya mencobanya pada file mp3.

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

Dimana -segment_time jumlah waktu yang Anda inginkan untuk setiap file (dalam detik).

Referensi

slm
sumber
Bekerja di mp3 s. Gagal untuk saya di m4b yang mengatakan, "Aliran audio tidak valid. Tepatnya satu aliran audio MP3 diperlukan."
vossad01
FYI, gantikan mp3denganm4a
Mikhail
Bagaimana dengan kasus di mana saya memiliki file 40 menit yang ingin saya bagi, katakanlah, 4 menit, 6 menit, 12 menit, 8 menit, 10 menit alih-alih terbagi menjadi sub-file yang seragam?
isosceleswheel
@isosceleswheel - lihat ini - unix.stackexchange.com/questions/94168/… .
slm
Ini juga berfungsi untuk file wav.
Mário Meyrelles
19

Untuk membagi file audio besar menjadi satu set lagu dengan panjang yang bervariasi, Anda dapat menggunakan perintah berikut:

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

Misalnya, saya memecah satu file .opus Inctrack Original Soundtrack menjadi sub-file menggunakan file teks ini yang berisi awal, akhir, nama:

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

Saya menulis awkprogram singkat ini untuk membaca file teks dan membuat ffmpegperintah dari setiap baris:

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

Berikut adalah versi yang lebih rinci pythondari program yang disebut split.py, di mana sekarang file trek asli dan file teks yang menentukan sub-trek dibaca dari baris perintah:

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

Anda dapat dengan mudah membangun lebih banyak dan lebih rumit ffmpegpanggilan dengan memodifikasi templat perintah dan / atau menambahkan lebih banyak bidang ke setiap baris file track_list.

roda sama kaki
sumber
ini fantastis, ! tolong beri tahu saya Cara menjalankan ini dari program python, yaitu saya ingin membaca audio, dan file penjelasan dengan awal, akhir, label. dan kemudian membagi audio menjadi potongan-potongan dengan ukuran yang sesuai dengan setiap baris dalam file.
kRazzy R
2
@kRazzyR subprocess.call(command)adalah pythonanalog ke system(command)dalam awk, yang keduanya memungkinkan Anda untuk mengirim ffmpegperintah shell. Saya mengedit posting saya untuk memasukkan pythonimplementasi yang fleksibel menggambarkan satu cara Anda bisa melakukan ini.
isosceleswheel
1
Dalam pengalaman saya, waktu mulai trek # 2 harus sama dengan waktu akhir trek # 1, dan seterusnya. Artinya, waktu contoh Anda akan melewati satu detik di antara setiap trek.
Tim Smith
1
Berikut ini adalah versi bash / zsh yang ringkas. Edit waktu yang diperlukan, dan kemudian hapus kata echo untuk benar-benar menjalankan perintah. 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 terima kasih untuk mengetahui hal itu, saya menambahkan hasil edit di atas. Tergantung pada pemain Anda, mungkin masih ada cegukan kecil di antara trek tetapi ini jelas terdengar lebih baik daripada memotong 1s.
isosceleswheel
3

Baris berikut akan membagi file audio menjadi beberapa file masing-masing dengan durasi 30 detik.

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

Ubah 30 (yang merupakan jumlah detik) ke nomor yang Anda inginkan.

Stryker
sumber
1

jawaban slm :

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

tidak akan bekerja untuk saya tanpa -map 0menambahkan:

ffmpeg -i somefile.mp3 -map 0 -f segment -segment_time 3 -c copy out%03d.mp3
Tak menentu
sumber
Pemetaan berfungsi dengan baik, tetapi juga tambahkan -vn untuk menghapus gambar yang disematkan, atau akan mencoba membuat ulang gambar untuk setiap segmen, (sloooowww).
Chris Reid
1

Solusi yang diberikan tidak berhasil untuk saya. Saya percaya ini karena versi yang lebih lama ffmpegpada sistem saya.
Bagaimanapun, saya ingin memberikan solusi yang berhasil bagi saya. Anda juga dapat menyesuaikan penghitung waktu sehingga memungkinkan tumpang tindih pada audio jika Anda mau.

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

Bagi file audio Anda menjadi 30 detik

tisaconundrum
sumber
Pertanyaan baru akan dibuat, karena ini tidak menjawab pertanyaan OP!
George Udosen