Skip to content

Commit 7abd6d8

Browse files
committed
BasswoodAV -> PyAV
1 parent 5079971 commit 7abd6d8

File tree

13 files changed

+134
-136
lines changed

13 files changed

+134
-136
lines changed

auto_editor/__main__.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -454,13 +454,13 @@ def main() -> None:
454454
buf.write(f"OS: {plat.system()} {plat.release()} {plat.machine().lower()}\n")
455455
buf.write(f"Python: {plat.python_version()}\nAV: ")
456456
try:
457-
import bv
457+
import av
458458
except (ModuleNotFoundError, ImportError):
459459
buf.write("not found")
460460
else:
461461
try:
462-
buf.write(f"{bv.__version__} ")
463-
license = bv._core.library_meta["libavcodec"]["license"]
462+
buf.write(f"{av.__version__} ")
463+
license = av._core.library_meta["libavcodec"]["license"]
464464
buf.write(f"({license})")
465465
except AttributeError:
466466
buf.write("error")

auto_editor/analyze.py

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@
99
from tempfile import gettempdir
1010
from typing import TYPE_CHECKING
1111

12-
import bv
12+
import av
1313
import numpy as np
14-
from bv.audio.fifo import AudioFifo
15-
from bv.subtitles.subtitle import AssSubtitle
14+
from av.audio.fifo import AudioFifo
15+
from av.subtitles.subtitle import AssSubtitle
1616

1717
from auto_editor import __version__
1818

@@ -72,18 +72,18 @@ def mut_remove_large(
7272
active = False
7373

7474

75-
def iter_audio(audio_stream: bv.AudioStream, tb: Fraction) -> Iterator[np.float32]:
75+
def iter_audio(audio_stream: av.AudioStream, tb: Fraction) -> Iterator[np.float32]:
7676
fifo = AudioFifo()
7777
sr = audio_stream.rate
7878

7979
exact_size = (1 / tb) * sr
8080
accumulated_error = Fraction(0)
8181

8282
# Resample so that audio data is between [-1, 1]
83-
resampler = bv.AudioResampler(bv.AudioFormat("flt"), audio_stream.layout, sr)
83+
resampler = av.AudioResampler(av.AudioFormat("flt"), audio_stream.layout, sr)
8484

8585
container = audio_stream.container
86-
assert isinstance(container, bv.container.InputContainer)
86+
assert isinstance(container, av.container.InputContainer)
8787

8888
for frame in container.decode(audio_stream):
8989
frame.pts = None # Skip time checks
@@ -103,7 +103,7 @@ def iter_audio(audio_stream: bv.AudioStream, tb: Fraction) -> Iterator[np.float3
103103

104104

105105
def iter_motion(
106-
video: bv.VideoStream, tb: Fraction, blur: int, width: int
106+
video: av.VideoStream, tb: Fraction, blur: int, width: int
107107
) -> Iterator[np.float32]:
108108
video.thread_type = "AUTO"
109109

@@ -113,7 +113,7 @@ def iter_motion(
113113
index = 0
114114
prev_index = -1
115115

116-
graph = bv.filter.Graph()
116+
graph = av.filter.Graph()
117117
graph.link_nodes(
118118
graph.add_buffer(template=video),
119119
graph.add("scale", f"{width}:-1"),
@@ -123,7 +123,7 @@ def iter_motion(
123123
).configure()
124124

125125
container = video.container
126-
assert isinstance(container, bv.container.InputContainer)
126+
assert isinstance(container, av.container.InputContainer)
127127

128128
for unframe in container.decode(video):
129129
if unframe.pts is None:
@@ -154,7 +154,7 @@ def iter_motion(
154154

155155
@dataclass(slots=True)
156156
class Levels:
157-
container: bv.container.InputContainer
157+
container: av.container.InputContainer
158158
name: str
159159
mod_time: int
160160
tb: Fraction
@@ -258,7 +258,7 @@ def audio(self, stream: int) -> NDArray[np.float32]:
258258
if audio.duration is not None and audio.time_base is not None:
259259
inaccurate_dur = int(audio.duration * audio.time_base * self.tb)
260260
elif container.duration is not None:
261-
inaccurate_dur = int(container.duration / bv.time_base * self.tb)
261+
inaccurate_dur = int(container.duration / av.time_base * self.tb)
262262
else:
263263
inaccurate_dur = 1024
264264

@@ -385,8 +385,8 @@ def initLevels(
385385
src: FileInfo, tb: Fraction, bar: Bar, no_cache: bool, log: Log
386386
) -> Levels:
387387
try:
388-
container = bv.open(src.path)
389-
except bv.FFmpegError as e:
388+
container = av.open(src.path)
389+
except av.FFmpegError as e:
390390
log.error(e)
391391

392392
mod_time = int(src.path.stat().st_mtime)

auto_editor/cmds/desc.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import sys
22
from dataclasses import dataclass, field
33

4-
import bv
4+
import av
55

66
from auto_editor.vanparse import ArgumentParser
77

@@ -21,7 +21,7 @@ def main(sys_args: list[str] = sys.argv[1:]) -> None:
2121
args = desc_options(ArgumentParser("desc")).parse_args(DescArgs, sys_args)
2222
for path in args.input:
2323
try:
24-
container = bv.open(path)
24+
container = av.open(path)
2525
desc = container.metadata.get("description", None)
2626
except Exception:
2727
desc = None

auto_editor/cmds/levels.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from fractions import Fraction
66
from typing import TYPE_CHECKING
77

8-
import bv
8+
import av
99
import numpy as np
1010

1111
from auto_editor.analyze import *
@@ -137,7 +137,7 @@ def main(sys_args: list[str] = sys.argv[1:]) -> None:
137137
):
138138
print_arr(arr)
139139
else:
140-
container = bv.open(src.path, "r")
140+
container = av.open(src.path, "r")
141141
audio_stream = container.streams.audio[obj["stream"]]
142142

143143
values = []
@@ -162,7 +162,7 @@ def value_storing_generator() -> Iterator[np.float32]:
162162
):
163163
print_arr(arr)
164164
else:
165-
container = bv.open(src.path, "r")
165+
container = av.open(src.path, "r")
166166
video_stream = container.streams.video[obj["stream"]]
167167

168168
values = []

auto_editor/cmds/subdump.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import sys
22
from dataclasses import dataclass, field
33

4-
import bv
5-
from bv.subtitles.subtitle import AssSubtitle
4+
import av
5+
from av.subtitles.subtitle import AssSubtitle
66

77
from auto_editor.json import dump
88
from auto_editor.vanparse import ArgumentParser
@@ -24,7 +24,7 @@ def main(sys_args: list[str] = sys.argv[1:]) -> None:
2424
if args.json:
2525
data = {}
2626
for input_file in args.input:
27-
container = bv.open(input_file)
27+
container = av.open(input_file)
2828
for s in range(len(container.streams.subtitles)):
2929
entry_data = []
3030

@@ -59,7 +59,7 @@ def main(sys_args: list[str] = sys.argv[1:]) -> None:
5959
return
6060

6161
for input_file in args.input:
62-
with bv.open(input_file) as container:
62+
with av.open(input_file) as container:
6363
for s in range(len(container.streams.subtitles)):
6464
print(f"file: {input_file} ({s}:{container.streams.subtitles[s].name})")
6565
for sub2 in container.decode(subtitles=s):

auto_editor/cmds/test.py

Lines changed: 23 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,9 @@
1111
from tempfile import mkdtemp
1212
from time import perf_counter
1313

14-
import bv
14+
import av
1515
import numpy as np
16+
from av import AudioStream, VideoStream
1617

1718
from auto_editor.ffwrapper import FileInfo
1819
from auto_editor.lang.palet import Lexer, Parser, env, interpret
@@ -164,36 +165,36 @@ def test_movflags(self) -> None:
164165
file = "resources/testsrc.mp4"
165166
out = self.main([file], ["--faststart"]) + ".mp4"
166167
fast = calculate_sha256(out)
167-
with bv.open(out) as container:
168-
assert isinstance(container.streams[0], bv.VideoStream)
169-
assert isinstance(container.streams[1], bv.AudioStream)
168+
with av.open(out) as container:
169+
assert isinstance(container.streams[0], VideoStream)
170+
assert isinstance(container.streams[1], AudioStream)
170171

171172
out = self.main([file], ["--no-faststart"]) + ".mp4"
172173
nofast = calculate_sha256(out)
173-
with bv.open(out) as container:
174-
assert isinstance(container.streams[0], bv.VideoStream)
175-
assert isinstance(container.streams[1], bv.AudioStream)
174+
with av.open(out) as container:
175+
assert isinstance(container.streams[0], VideoStream)
176+
assert isinstance(container.streams[1], AudioStream)
176177

177178
out = self.main([file], ["--fragmented"]) + ".mp4"
178179
frag = calculate_sha256(out)
179-
with bv.open(out) as container:
180-
assert isinstance(container.streams[0], bv.VideoStream)
181-
assert isinstance(container.streams[1], bv.AudioStream)
180+
with av.open(out) as container:
181+
assert isinstance(container.streams[0], VideoStream)
182+
assert isinstance(container.streams[1], AudioStream)
182183

183184
assert fast != nofast, "+faststart is not being applied"
184185
assert frag not in (fast, nofast), "fragmented output should diff."
185186

186187
def test_example(self) -> None:
187188
out = self.main(["example.mp4"], [], output="example_ALTERED.mp4")
188-
with bv.open(out) as container:
189+
with av.open(out) as container:
189190
assert container.duration is not None
190191
assert container.duration > 17300000 and container.duration < 2 << 24
191192

192193
assert len(container.streams) == 2
193194
video = container.streams[0]
194195
audio = container.streams[1]
195-
assert isinstance(video, bv.VideoStream)
196-
assert isinstance(audio, bv.AudioStream)
196+
assert isinstance(video, VideoStream)
197+
assert isinstance(audio, AudioStream)
197198
assert video.base_rate == 30
198199
assert video.average_rate is not None
199200
assert video.average_rate == 30, video.average_rate
@@ -207,28 +208,28 @@ def test_example(self) -> None:
207208

208209
def test_video_to_mp3(self) -> None:
209210
out = self.main(["example.mp4"], [], output="example_ALTERED.mp3")
210-
with bv.open(out) as container:
211+
with av.open(out) as container:
211212
assert container.duration is not None
212213
assert container.duration > 17300000 and container.duration < 2 << 24
213214

214215
assert len(container.streams) == 1
215216
audio = container.streams[0]
216-
assert isinstance(audio, bv.AudioStream)
217+
assert isinstance(audio, AudioStream)
217218
assert audio.codec.name in ("mp3", "mp3float")
218219
assert audio.sample_rate == 48000
219220
assert audio.layout.name == "stereo"
220221

221222
def test_to_mono(self) -> None:
222223
out = self.main(["example.mp4"], ["-layout", "mono"], output="example_mono.mp4")
223-
with bv.open(out) as container:
224+
with av.open(out) as container:
224225
assert container.duration is not None
225226
assert container.duration > 17300000 and container.duration < 2 << 24
226227

227228
assert len(container.streams) == 2
228229
video = container.streams[0]
229230
audio = container.streams[1]
230-
assert isinstance(video, bv.VideoStream)
231-
assert isinstance(audio, bv.AudioStream)
231+
assert isinstance(video, VideoStream)
232+
assert isinstance(audio, AudioStream)
232233
assert video.base_rate == 30
233234
assert video.average_rate is not None
234235
assert video.average_rate == 30, video.average_rate
@@ -305,18 +306,18 @@ def test_input_extension(self):
305306
self.check([path, "--no-open"], "must have an extension")
306307

307308
def test_silent_threshold(self):
308-
with bv.open("resources/new-commentary.mp3") as container:
309+
with av.open("resources/new-commentary.mp3") as container:
309310
assert container.duration is not None
310-
assert container.duration / bv.time_base == 6.732
311+
assert container.duration / av.time_base == 6.732
311312

312313
out = self.main(
313314
["resources/new-commentary.mp3"], ["--edit", "audio:threshold=0.1"]
314315
)
315316
out += ".mp3"
316317

317-
with bv.open(out) as container:
318+
with av.open(out) as container:
318319
assert container.duration is not None
319-
assert container.duration / bv.time_base == 6.552
320+
assert container.duration / av.time_base == 6.552
320321

321322
def test_track(self):
322323
out = self.main(["resources/multi-track.mov"], []) + ".mov"

0 commit comments

Comments
 (0)