![如何将一个音频文件分割成多个?](https://linux22.com/image/7368/%E5%A6%82%E4%BD%95%E5%B0%86%E4%B8%80%E4%B8%AA%E9%9F%B3%E9%A2%91%E6%96%87%E4%BB%B6%E5%88%86%E5%89%B2%E6%88%90%E5%A4%9A%E4%B8%AA%EF%BC%9F.png)
我找到了一些视频,看起来像这样。
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
我尝试将其用于音频文件,但只有第一个音频文件包含实际音频,其他音频文件都保持沉默,除此之外它很好,它每秒都会生成一个新的音频文件。有谁知道要修改什么才能使其与音频文件一起使用,或者另一个可以执行相同操作的命令?
答案1
当我在 mp3 文件上尝试时,这对我有用。
$ ffmpeg -i somefile.mp3 -f segment -segment_time 3 -c copy out%03d.mp3
其中-segment_time
是每个文件所需的时间(以秒为单位)。
参考
答案2
要将大音频文件拆分为一组不同长度的轨道,可以使用以下命令:
# -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 sys
import subprocess
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 文件的每一行添加更多字段来轻松构建越来越复杂的调用。
答案3
以下行将把一个音频文件分割成多个文件,每个文件持续时间为 30 秒。
ffmpeg -i file.wav -f segment -segment_time 30 -c copy parts/output%09d.wav
将 30(秒数)更改为您想要的任何数字。
答案4
给定的解决方案对我不起作用。我相信这是由于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 秒的增量