如何将音频文件分割成多个?


35

我找到了一些视频,看起来像这样。

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
@silibnx正如我在问题中解释的那样,将音频文件的每一秒都拆分为新的音频文件。
DisplayName

Answers:


51

当我在mp3文件上尝试时,这对我有用。

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

-segment_time每个文件所需的时间在哪里(以秒为单位)。

参考文献


mp3上工作。在m4b上对我失败,说:“无效的音频流。仅需要一个MP3音频流。”
vossad01

仅供参考,mp3m4a
米哈伊尔(Mikhail)

如果我有一个40分钟的文件要分解成例如4min,6min,12min,8min,10min而不是分解成统一的子文件,该怎么办?
isosceleswheel

@isosceleswheel-看看这个-unix.stackexchange.com/questions/94168/…
slm

它也适用于wav文件。
马里奥Meyrelles

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)python模拟system(command)awk,这两者允许您发送ffmpeg命令外壳。我编辑了我的文章,以包含一个灵活的python实现方式,说明了您可以采用的一种方法。
isosceleswheel

1
以我的经验,第2条曲目的开始时间应等于第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感谢您捕捉到这一点,我在上面添加了一个编辑。根据您的播放器的不同,音轨之间可能还会出现一些小小的打but,但这绝对比砍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的问题!
George Udosen
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.