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

Skip to content

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