鱼C论坛

 找回密码
 立即注册
查看: 220|回复: 5

ffmpeg 按约每30分钟切分长音视频,但不能把句子切断。从30分种的静默处前后切分

[复制链接]
发表于 2024-11-1 11:40:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
ffmpeg 按约每30分钟切分长音视频,但不能把句子切断。从30分种的静默处前后切分 。 该怎么做?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-11-1 11:52:50 | 显示全部楼层
要使用 `ffmpeg` 按每30分钟切分长音视频,并确保不在句子中间切断,可以使用以下步骤:

1. **检测静默段**:首先,使用 `ffmpeg` 检测音频中的静默段。可以使用 `silencedetect` 滤镜来识别音频中的静默部分。

2. **切分音频**:根据检测到的静默段,选择最接近30分钟的静默点进行切分。

以下是一个大致的步骤:

1. **检测静默段**:

   使用 `ffmpeg` 的 `silencedetect` 滤镜来检测音频中的静默段:

ffmpeg -i input.mp4 -af silencedetect=n=-50dB:d=1 -f null -

   这条命令会输出音频中静默段的时间戳。

2. **解析静默段**:

   解析 `ffmpeg` 输出的静默段时间戳,找到最接近每30分钟的静默点。

3. **切分音频**:

   使用 `ffmpeg` 的 `-ss` 和 `-to` 参数来切分音频:

ffmpeg -i input.mp4 -ss start_time -to end_time -c copy output_part1.mp4

   其中 `start_time` 和 `end_time` 是你解析出的静默段时间戳。

通过这种方法,你可以在不打断句子的情况下,按每30分钟切分音视频。需要注意的是,解析和处理静默段时间戳可能需要编写额外的脚本来自动化这个过程。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-11-1 14:16:52 | 显示全部楼层

from pydub import AudioSegment
from pydub.silence import split_on_silence

# 读入音频
sound = AudioSegment.from_file("input.mp3")

# 分割
chunks = split_on_silence(sound, min_silence_len=300, silence_thresh=-70)

# 保存所有分段
for i, chunk in enumerate(chunks):
    chunk.export(f"output_{i}.mp3", format="mp3")

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-11-2 12:58:07 | 显示全部楼层
很cool的阳 发表于 2024-11-1 14:16
from pydub import AudioSegment
from pydub.silence import split_on_silence

min_silence_len=300  , 这个是啥单位? 生成了几百个小文件。
我把它改成  300*1000 后, 一个30分钟的大文件,现在还没切出来!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-11-2 13:45:48 | 显示全部楼层
FishC 发表于 2024-11-1 11:52
要使用 `ffmpeg` 按每30分钟切分长音视频,并确保不在句子中间切断,可以使用以下步骤:

1. **检测静默 ...

你能把这段代码按要求改一下吗?
from pydub import AudioSegment
from pydub.silence import detect_silence

MIN_SILENCE=500
SILENCE_THRESH=-40
MIN_LENGTH=300*1000 # 25*1000,  25 seconds in my case
MAX_LENGTH=350*1000 #  30*1000,  30 seconds in my case
filename = 'cn1.wav'
file_prefix = 'last_'
sound = AudioSegment.from_file(filename, format="wav")
silent_ranges = detect_silence(sound, min_silence_len=MIN_SILENCE, silence_thresh=SILENCE_THRESH)
print(silent_ranges, '---------------------------')
last_silence = 0
chunk = 0
for range in silent_ranges:
    # if  range[1] - last_silence > MIN_LENGTH and range[1] - last_silence < MAX_LENGTH:        
    sound[last_silence:range[1]].export(f'{file_prefix}-{chunk}.wav', format="wav")
    chunk = chunk +1
    last_silence = range[1]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-11-2 13:49:33 | 显示全部楼层
blackantt 发表于 2024-11-02 13:45
你能把这段代码按要求改一下吗?
from pydub import  ...


要修改这段代码以满足你的要求,我们需要确保在每个音频片段的长度在 `MIN_LENGTH` 和 `MAX_LENGTH` 之间,并且在静默处切分。以下是修改后的代码:
from pydub import AudioSegment
from pydub.silence import detect_silence

MIN_SILENCE = 500
SILENCE_THRESH = -40
MIN_LENGTH = 300 * 1000  # 300 seconds
MAX_LENGTH = 350 * 1000  # 350 seconds
filename = 'cn1.wav'
file_prefix = 'last_'
sound = AudioSegment.from_file(filename, format="wav")
silent_ranges = detect_silence(sound, min_silence_len=MIN_SILENCE, silence_thresh=SILENCE_THRESH)

last_silence = 0
chunk = 0

for start, end in silent_ranges:
    if MIN_LENGTH <= (start - last_silence) <= MAX_LENGTH:
        sound[last_silence:start].export(f'{file_prefix}{chunk}.wav', format="wav")
        chunk += 1
        last_silence = start

# Export the last segment if it wasn't exported
if last_silence < len(sound):
    sound[last_silence:].export(f'{file_prefix}{chunk}.wav', format="wav")

### 主要修改点:

1. **静默范围的处理**:使用 `for start, end in silent_ranges` 来遍历静默段的开始和结束时间。
2. **条件判断**:在导出音频片段之前,检查片段长度是否在 `MIN_LENGTH` 和 `MAX_LENGTH` 之间。
3. **导出最后一个片段**:在循环结束后,检查是否有剩余的音频片段需要导出。

这样可以确保音频在静默处切分,并且每个片段的长度在指定范围内。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 12:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表