Bir ses dosyasını nasıl birden fazlaya bölerim?


35

Bunun gibi görünen videolar için bir şey buldum.

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

Bunu bir ses dosyası için kullanmayı denedim, ancak yalnızca gerçek ses içeren ilk ses dosyası, diğerleri sessizdi, bunun dışında iyi, her saniye için yeni bir ses dosyası yaptı. Bunun ses dosyaları ile çalışmasını sağlamak için neyin değiştirileceğini bilen var mı?


Bunu yapmanın başka yollarını istiyorsanız, lütfen neyi başarmaya çalıştığınızı daha ayrıntılı olarak açıklayın. ffmpeg cmdline'larını hatırlaması zor.

1
@siblynx Soruda açıkladığım gibi, bir ses dosyasının her saniyesini yeni ses dosyalarına bölün.
DisplayName

Yanıtlar:


51

Bir mp3 dosyasında denedim bu benim için çalıştı.

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

-segment_timeHer dosya için istediğiniz zaman miktarı (saniye cinsinden) nerede ?

Referanslar


Mp3 s çalıştı . Benim için başarısız oldu m4b s, "Geçersiz ses akışı. Tam olarak bir MP3 ses akışı gerekli."
vossad01

Bilginize, yerini mp3ilem4a
Mikhail

40 dakika dosyamın içine girip, 4 dakika, 6 dakika, 12 dakika, 8 dakika, 10 dakika yerine tek tip alt dosyalara bölmek istediğim bir dava ne olacak?
isosceleswheel

@isosceleswheel - Şuna bir bak - unix.stackexchange.com/questions/94168/… .
slm

Ayrıca wav dosyaları için çalıştı.
Mário Meyrelles

19

Büyük bir ses dosyasını farklı uzunluklarda bir parça setine bölmek için aşağıdaki komutu kullanabilirsiniz:

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

Örneğin, Inception Original Soundtrack'ın tek bir .opus dosyasını, başlangıç, bitiş, ad içeren bu metin dosyasını kullanarak alt dosyalara böldüm:

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

Bu kısa awkprogramı metin dosyasını okumak ve ffmpegher satırdan komutlar oluşturmak için yazdım :

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

Aşağıda daha ayrıntılı bir pythonadlandırılan programın versiyonu split.pyorijinal parça dosya hem şimdi, ve alt parçaları belirterek metin dosyası komut satırından okunur:

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

ffmpegKomut şablonunu değiştirerek ve / veya track_list dosyasının her satırına daha fazla alan ekleyerek kolayca daha karmaşık aramalar oluşturabilirsiniz.


bu fantastik, ! Lütfen bana bunu bir python programından nasıl çalıştıracağınızı söyleyin, yani ses ve başlangıç, son, etiketli not dosyalarını okumak istiyorum. ve daha sonra, ses dosyasını dosyadaki her satıra karşılık gelen boyutlara sahip parçalara ayırın.
kRazzy R

2
@kRazzyR subprocess.call(command)olduğu pythonanalog system(command)içinde awkgöndermek için izin, her ikisi de ffmpegkabuk komutları. Görevimi, bunun için kullanabileceğiniz pythonbir yolu gösteren esnek bir uygulama içerecek şekilde düzenledim .
isosceleswheel

1
Tecrübelerime göre # 2 parçasının başlangıç ​​zamanı # 1 parçasının bitiş zamanına eşit olmalı. Yani, örnek zamanlarınız her parça arasında bir saniye atlama yapacaktır.
Tim Smith,

1
İşte kompakt bir bash / zsh sürümü. Gerektiği gibi saatleri düzenleyin ve sonra echo gerçekten komutları çalıştırmak için sözcüğü kaldırın . 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 bunu yakaladığınız için teşekkürler, yukarıda bir düzenleme ekledim. Müzik çalarınıza bağlı olarak, parçalar arasında küçük bir hıçkırık olabilir, ancak bu kesinlikle 1'leri kesmekten daha iyidir.
isosceleswheel

3

Aşağıdaki satır, bir ses dosyasını her biri 30 sn süren birden fazla dosyaya böler.

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

30'u (saniye sayısı olan) istediğiniz sayı ile değiştirin.


1

slm'nin cevabı :

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

benim için işe yaramazsa şunu -map 0ekledi:

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

Haritalama harika çalışıyor, ancak gömülü resimleri çıkarmak için -vn de ekleyin, yoksa her bölüm için resmi yeniden oluşturmaya çalışır (sloooowww).
Chris Reid

1

Verilen çözüm benim için işe yaramadı. Bunun ffmpegsistemimdeki eski bir sürümden kaynaklandığına inanıyorum .
Her durumda, benim için işe yarayan bir çözüm sunmak istedim . Zamanlayıcıları, isterseniz sesin üst üste binmesine izin verecek şekilde özelleştirebilirsiniz.

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

ses dosyalarınızı 30 saniyelik artışlara böl


OP'nin sorusunu yanıtlamadığından yeni bir soru sırayla gerçekleşir!
George Udosen,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.