8000 Finalize split_silence · XingfuY/ffmpeg-python@ad58a38 · GitHub
[go: up one dir, main page]

Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit ad58a38

Browse files
committed
Finalize split_silence
1 parent 4311e33 commit ad58a38

File tree

2 files changed

+21
-4
lines changed

2 files changed

+21
-4
lines changed

examples/requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
ffmpeg

examples/split_silence.py

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,15 @@
22
from __future__ import unicode_literals
33

44
import argparse
5+
import errno
56
import ffmpeg
67
import logging
8+
import os
79
import re
810
import subprocess
11+
import sys
912

10-
11-
logging.basicConfig(level=logging.INFO)
13+
logging.basicConfig(level=logging.INFO, format='%(message)s')
1214
logger = logging.getLogger(__file__)
1315
logger.setLevel(logging.INFO)
1416

@@ -17,7 +19,7 @@
1719

1820
parser = argparse.ArgumentParser(description='Split media into separate chunks wherever silence occurs')
1921
parser.add_argument('in_filename', help='Input filename (`-` for stdin)')
20-
parser.add_argument('out_pattern', help='Output filename pattern (e.g. `out/chunk_%%04d.wav`)')
22+
parser.add_argument('out_pattern', help='Output filename pattern (e.g. `out/chunk_{:04d}.wav`)')
2123
parser.add_argument('--silence-threshold', default=DEFAULT_THRESHOLD, type=int, help='Silence threshold (in dB)')
2224
parser.add_argument('--silence-duration', default=DEFAULT_DURATION, type=float, help='Silence duration')
2325
parser.add_argument('--start-time', type=float, help='Start time (seconds)')
@@ -47,6 +49,9 @@ def get_chunk_times(in_filename, silence_threshold, silence_duration, start_time
4749
)
4850
p = subprocess.Popen(['ffmpeg'] + args, stderr=subprocess.PIPE)
4951
output = p.communicate()[1].decode('utf-8')
52+
if p.returncode != 0:
53+
sys.stderr.write(output)
54+
sys.exit(1)
5055
lines = output.splitlines()
5156

5257
# Chunks start when silence ends, and chunks end when silence starts.
@@ -80,6 +85,14 @@ def get_chunk_times(in_filename, silence_threshold, silence_duration, start_time
8085
return list(zip(chunk_starts, chunk_ends))
8186

8287

88+
def _makedirs(path):
89+
"""Python2-compatible version of ``os.makedirs(path, exist_ok=True)``."""
90+
try:
91+
os.makedirs(path)
92+
except OSError as exc:
93+
if exc.errno != errno.EEXIST or not os.path.isdir(path):
94+
raise
95+
8396
def split_audio(
8497
in_filename,
8598
out_pattern,
@@ -89,9 +102,12 @@ def split_audio(
89102
end_time=None,
90103
):
91104
chunk_times = get_chunk_times(in_filename, silence_threshold, silence_duration, start_time, end_time)
105+
92106
for i, (start_time, end_time) in enumerate(chunk_times):
93107
time = end_time - start_time
94-
out_filename = out_pattern % i
108+
out_filename = out_pattern.format(i, i=i)
109+
_makedirs(os.path.dirname(out_filename))
110+
95111
logger.info('{}: start={:.02f}, end={:.02f}, duration={:.02f}'.format(out_filename, start_time, end_time,
96112
time))
97113
subprocess.Popen(

0 commit comments

Comments
 (0)
0