मैं एक ऑडियो फ़ाइल को एकाधिक में कैसे विभाजित करूं?


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 cmdlines को याद रखना कठिन है।

1
@sablynx जैसा कि मैंने प्रश्न में बताया है, ऑडियो फ़ाइल के प्रत्येक सेकंड को नई ऑडियो फ़ाइलों में विभाजित करें।
डिस्प्लेनेम

जवाबों:


52

यह मेरे लिए तब काम आया जब मैंने इसे एक एमपी 3 फ़ाइल पर आज़माया।

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

कहाँ -segment_timeसमय की राशि है जो आप (सेकंड में) प्रत्येक फ़ाइल प्रति चाहते हैं।

संदर्भ


एमपी 3 पर काम किया । M4b के लिए मेरे लिए यह कहना विफल रहा, "अमान्य ऑडियो स्ट्रीम। वास्तव में एक एमपी 3 ऑडियो स्ट्रीम आवश्यक है।"
vossad01

FYI करें, के mp3साथ प्रतिस्थापितm4a
मिखाइल

एक ऐसे मामले के बारे में जहां मेरे पास एक 40min फाइल है जिसे मैं तोड़ना चाहूंगा, जैसे 4min, 6min, 12min, 8min, 10min के बजाय वर्दी उप-फाइलों में टूटना?
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

उदाहरण के लिए, मैंने प्रारंभ, अंत, नाम वाले इस पाठ फ़ाइल का उपयोग करके उप-फ़ाइलों में इंसेप्शन ओरिजिनल साउंडट्रैक की एकल .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से कमांड टेम्प्लेट को संशोधित करके और ट्रैक_लिस्ट फ़ाइल की प्रत्येक पंक्ति में अधिक फ़ील्ड जोड़कर अधिक से अधिक जटिल कॉल बना सकते हैं ।


यह शानदार है, ! कृपया मुझे बताएं कि इसे पायथन प्रोग्राम से कैसे चलाया जाए, यानी मैं ऑडियो पढ़ना चाहता हूं, और एनोटेशन फ़ाइल शुरू, अंत, लेबल के साथ। और फिर फ़ाइल में प्रत्येक पंक्ति के अनुरूप आकारों के साथ ऑडियो को टुकड़ों में विभाजित करें।
krazzy आर

2
@kRazzyR subprocess.call(command)है pythonकरने के लिए अनुरूप system(command)में awkदोनों का उपयोग आप भेजने के लिए अनुमति देते हैं, ffmpegआदेशों खोल। मैंने अपनी पोस्ट को एक लचीले pythonकार्यान्वयन को शामिल करने के लिए संपादित किया, जिससे आप इस बारे में बता सकें।
isosceleswheel 3

1
मेरे अनुभव में ट्रैक # 2 की शुरुआत का समय ट्रैक # 1 के अंत समय के बराबर होना चाहिए, और इसी तरह। यही है, आपका उदाहरण समय प्रत्येक ट्रैक के बीच एक दूसरे को छोड़ देगा।
टिम स्मिथ

1
यहाँ एक कॉम्पैक्ट बैश / 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 को पकड़ने के लिए धन्यवाद, मैंने ऊपर एक संपादन जोड़ा। अपने खिलाड़ी के आधार पर, पटरियों के बीच अभी भी एक छोटी हिचकी हो सकती है लेकिन यह निश्चित रूप से 1s को बाहर निकालने से बेहतर लगता है।
isosceleswheel

3

निम्न पंक्ति 30 सेकंड की अवधि के साथ एक ऑडियो फ़ाइल को कई फाइलों में विभाजित करेगी।

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

30 (जो सेकंड की संख्या है) को किसी भी संख्या में बदलें जो आप चाहते हैं।


1

एसएलएम का जवाब :

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 भी जोड़ते हैं, या यह प्रत्येक सेगमेंट के लिए तस्वीर को फिर से बनाने की कोशिश करेगा, (स्लोवॉव)।
क्रिस रीड

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 सेकंड की वृद्धि में विभाजित करें


एक नया प्रश्न क्रम में होगा, क्योंकि यह ओपी के प्रश्न का उत्तर नहीं देता है!
जॉर्ज उडेन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.