Làm cách nào để chia một tệp âm thanh thành nhiều?


36

Tôi tìm thấy một cái gì đó cho video, trông như thế này.

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

Tôi đã thử sử dụng nó cho một tệp âm thanh, nhưng chỉ có tệp âm thanh đầu tiên chứa âm thanh thực tế, các tệp khác đều im lặng, ngoài ra nó tốt, nó tạo ra một tệp âm thanh mới cho mỗi giây. Có ai biết phải sửa đổi gì để làm cho điều này hoạt động với các tệp âm thanh, hoặc một lệnh khác có thể làm tương tự không?


Nếu bạn muốn những cách khác để làm điều này thì hãy giải thích chi tiết hơn những gì bạn đang cố gắng để đạt được. cmdlines ffmpeg là khó nhớ.

1
@sizablenx Như tôi đã giải thích trong câu hỏi, hãy chia từng giây của tệp âm thanh thành các tệp âm thanh mới.
DisplayName

Câu trả lời:


52

Điều này làm việc cho tôi khi tôi thử nó trên một tệp mp3.

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

Trong trường hợp -segment_timelà số lượng thời gian bạn muốn cho mỗi tập tin (tính bằng giây).

Tài liệu tham khảo


Làm việc trên mp3 s. Không thành công với tôi trên m4b , "Luồng âm thanh không hợp lệ. Chính xác là cần một luồng âm thanh MP3."
vossad01

FYI, thay thế mp3bằngm4a
Mikhail

Thế còn trường hợp tôi có một tệp 40 phút mà tôi muốn đột nhập, giả sử, 4 phút, 6 phút, 12 phút, 8 phút, 10 phút thay vì chia thành các tệp phụ thống nhất thì sao?
isosceleswheel

@isosceleswheel - hãy xem cái này - unix.stackexchange.com/questions/94168/ Ấn .
slm

Nó cũng làm việc cho các tập tin wav.
Mário Meyrelles

19

Để chia một tệp âm thanh lớn thành một tập các bản nhạc có độ dài khác nhau, bạn có thể sử dụng lệnh sau:

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

Ví dụ: tôi đã chia một tệp .opus của Soundtrack gốc Inception thành các tệp phụ bằng cách sử dụng tệp văn bản này có chứa start, end, name:

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

Tôi đã viết awkchương trình ngắn này để đọc tệp văn bản và tạo ffmpegcác lệnh từ mỗi dòng:

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

Đây là một pythonphiên bản chi tiết hơn của chương trình được gọi split.py, trong đó bây giờ cả tệp theo dõi gốc tệp văn bản chỉ định các bản nhạc phụ được đọc từ dòng lệnh:

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

Bạn có thể dễ dàng xây dựng ffmpegcác cuộc gọi ngày càng phức tạp hơn bằng cách sửa đổi mẫu lệnh và / hoặc thêm nhiều trường vào mỗi dòng của tệp track_list.


Cái này thật tuyệt, ! vui lòng cho tôi biết Cách chạy chương trình này từ chương trình python, tức là tôi muốn đọc âm thanh và tệp chú thích với bắt đầu, kết thúc, nhãn. và sau đó chia âm thanh thành các phần với kích thước tương ứng với từng dòng trong tệp.
kRazzy R

2
@kRazzyR subprocess.call(command)pythontương tự system(command)trong awk, cả hai đều cho phép bạn gửi ffmpeglệnh shell. Tôi đã chỉnh sửa bài đăng của mình để bao gồm pythontriển khai linh hoạt minh họa một cách bạn có thể thực hiện về việc này.
isosceleswheel

1
Theo kinh nghiệm của tôi, thời gian bắt đầu của bài hát số 2 phải bằng với thời gian kết thúc của bài hát số 1, v.v. Đó là, thời gian ví dụ của bạn sẽ bỏ qua một giây giữa mỗi bản nhạc.
Tim Smith

1
Đây là một phiên bản bash / zsh nhỏ gọn. Chỉnh sửa thời gian khi cần thiết, và sau đó loại bỏ từ echo để thực sự chạy các lệnh. 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 cảm ơn vì đã nắm bắt được điều đó, tôi đã thêm một chỉnh sửa ở trên. Tùy thuộc vào trình phát của bạn, vẫn có thể có một tiếng nấc nhỏ giữa các bản nhạc nhưng điều này chắc chắn nghe tốt hơn so với cắt ra 1 giây.
isosceleswheel

3

Dòng sau sẽ chia một tệp âm thanh thành nhiều tệp, mỗi tệp có thời lượng 30 giây.

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

Thay đổi 30 (là số giây) thành bất kỳ số nào bạn muốn.


1

câu trả lời của slm :

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

sẽ không làm việc cho tôi mà không cần -map 0thêm:

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

Ánh xạ hoạt động rất tốt, nhưng cũng thêm -vn để loại bỏ bất kỳ hình ảnh nào được nhúng hoặc nó sẽ cố gắng tạo lại hình ảnh cho từng phân đoạn, (sloooowww).
Chris Reid

1

Các giải pháp đưa ra đã không làm việc cho tôi. Tôi tin rằng điều này là do một phiên bản cũ hơn ffmpegtrên hệ thống của tôi.
Trong mọi trường hợp, tôi muốn cung cấp một giải pháp hiệu quả cho tôi. Bạn cũng có thể tùy chỉnh bộ hẹn giờ để cho phép trùng lặp trên âm thanh nếu bạn muốn.

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

chia các tập tin âm thanh của bạn thành gia số 30 giây


Một câu hỏi mới sẽ được sắp xếp theo thứ tự, vì điều này không trả lời câu hỏi của OP!
George Udosen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.