Skip to content

Commit 4274faa

Browse files
committed
Use bv
1 parent 304aa2f commit 4274faa

13 files changed

+115
-115
lines changed

auto_editor/__main__.py

+3-3
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 av
457+
import bv
458458
except (ModuleNotFoundError, ImportError):
459459
buf.write("not found")
460460
else:
461461
try:
462-
buf.write(f"{av.__version__} ")
463-
license = av._core.library_meta["libavcodec"]["license"]
462+
buf.write(f"{bv.__version__} ")
463+
license = bv._core.library_meta["libavcodec"]["license"]
464464
buf.write(f"({license})")
465465
except AttributeError:
466466
buf.write("error")

auto_editor/analyze.py

+13-13
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 av
12+
import bv
1313
import numpy as np
14-
from av.audio.fifo import AudioFifo
15-
from av.subtitles.subtitle import AssSubtitle
14+
from bv.audio.fifo import AudioFifo
15+
from bv.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: av.AudioStream, tb: Fraction) -> Iterator[np.float32]:
75+
def iter_audio(audio_stream: bv.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 = av.AudioResampler(av.AudioFormat("flt"), audio_stream.layout, sr)
83+
resampler = bv.AudioResampler(bv.AudioFormat("flt"), audio_stream.layout, sr)
8484

8585
container = audio_stream.container
86-
assert isinstance(container, av.container.InputContainer)
86+
assert isinstance(container, bv.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: av.AudioStream, tb: Fraction) -> Iterator[np.float3
103103

104104

105105
def iter_motion(
106-
video: av.VideoStream, tb: Fraction, blur: int, width: int
106+
video: bv.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 = av.filter.Graph()
116+
graph = bv.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, av.container.InputContainer)
126+
assert isinstance(container, bv.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: av.container.InputContainer
157+
container: bv.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 / av.time_base * self.tb)
261+
inaccurate_dur = int(container.duration / bv.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 = av.open(src.path)
389-
except av.FFmpegError as e:
388+
container = bv.open(src.path)
389+
except bv.FFmpegError as e:
390390
log.error(e)
391391

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

auto_editor/cmds/levels.py

+3-3
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 av
8+
import bv
99
import numpy as np
1010

1111
from auto_editor.analyze import *
@@ -134,7 +134,7 @@ def main(sys_args: list[str] = sys.argv[1:]) -> None:
134134
if (arr := levels.read_cache("audio", (obj["stream"],))) is not None:
135135
print_arr(arr)
136136
else:
137-
container = av.open(src.path, "r")
137+
container = bv.open(src.path, "r")
138138
audio_stream = container.streams.audio[obj["stream"]]
139139

140140
values = []
@@ -155,7 +155,7 @@ def value_storing_generator() -> Iterator[np.float32]:
155155
if (arr := levels.read_cache("motion", mobj)) is not None:
156156
print_arr(arr)
157157
else:
158-
container = av.open(src.path, "r")
158+
container = bv.open(src.path, "r")
159159
video_stream = container.streams.video[obj["stream"]]
160160

161161
values = []

auto_editor/cmds/subdump.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import sys
22
from dataclasses import dataclass, field
33

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

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

@@ -61,7 +61,7 @@ def main(sys_args: list[str] = sys.argv[1:]) -> None:
6161
return
6262

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

auto_editor/cmds/test.py

+17-17
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from tempfile import mkdtemp
1212
from time import perf_counter
1313

14-
import av
14+
import bv
1515
import numpy as np
1616

1717
from auto_editor.ffwrapper import FileInfo, initFileInfo
@@ -161,35 +161,35 @@ def test_movflags(self) -> None:
161161
file = "resources/testsrc.mp4"
162162
out = self.main([file], ["--faststart"]) + ".mp4"
163163
fast = calculate_sha256(out)
164-
with av.open(out) as container:
165-
assert isinstance(container.streams[0], av.VideoStream)
166-
assert isinstance(container.streams[1], av.AudioStream)
164+
with bv.open(out) as container:
165+
assert isinstance(container.streams[0], bv.VideoStream)
166+
assert isinstance(container.streams[1], bv.AudioStream)
167167

168168
out = self.main([file], ["--no-faststart"]) + ".mp4"
169169
nofast = calculate_sha256(out)
170-
with av.open(out) as container:
171-
assert isinstance(container.streams[0], av.VideoStream)
172-
assert isinstance(container.streams[1], av.AudioStream)
170+
with bv.open(out) as container:
171+
assert isinstance(container.streams[0], bv.VideoStream)
172+
assert isinstance(container.streams[1], bv.AudioStream)
173173

174174
out = self.main([file], ["--fragmented"]) + ".mp4"
175175
frag = calculate_sha256(out)
176-
with av.open(out) as container:
177-
assert isinstance(container.streams[0], av.VideoStream)
178-
assert isinstance(container.streams[1], av.AudioStream)
176+
with bv.open(out) as container:
177+
assert isinstance(container.streams[0], bv.VideoStream)
178+
assert isinstance(container.streams[1], bv.AudioStream)
179179

180180
assert fast != nofast, "+faststart is not being applied"
181181
assert frag not in (fast, nofast), "fragmented output should diff."
182182

183183
def test_example(self) -> None:
184184
out = self.main(["example.mp4"], [], output="example_ALTERED.mp4")
185-
with av.open(out) as container:
185+
with bv.open(out) as container:
186186
assert container.duration is not None
187187
assert container.duration > 17300000 and container.duration < 2 << 24
188188

189189
video = container.streams[0]
190190
audio = container.streams[1]
191-
assert isinstance(video, av.VideoStream)
192-
assert isinstance(audio, av.AudioStream)
191+
assert isinstance(video, bv.VideoStream)
192+
assert isinstance(audio, bv.AudioStream)
193193
assert video.base_rate == 30
194194
assert video.average_rate is not None
195195
assert video.average_rate == 30, video.average_rate
@@ -265,16 +265,16 @@ def test_input_extension(self):
265265
self.check([path, "--no-open"], "must have an extension")
266266

267267
def test_silent_threshold(self):
268-
with av.open("resources/new-commentary.mp3") as container:
269-
assert container.duration / av.time_base == 6.732
268+
with bv.open("resources/new-commentary.mp3") as container:
269+
assert container.duration / bv.time_base == 6.732
270270

271271
out = self.main(
272272
["resources/new-commentary.mp3"], ["--edit", "audio:threshold=0.1"]
273273
)
274274
out += ".mp3"
275275

276-
with av.open(out) as container:
277-
assert container.duration / av.time_base == 6.552
276+
with bv.open(out) as container:
277+
assert container.duration / bv.time_base == 6.552
278278

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

auto_editor/edit.py

+16-16
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88
from subprocess import run
99
from typing import TYPE_CHECKING, Any
1010

11-
import av
12-
from av import AudioResampler, Codec
11+
import bv
12+
from bv import AudioResampler, Codec
1313

1414
from auto_editor.ffwrapper import FileInfo, initFileInfo
1515
from auto_editor.lib.contracts import is_int, is_str
@@ -86,7 +86,7 @@ def set_video_codec(
8686
if ctr.vcodecs is not None and codec not in ctr.vcodecs:
8787
try:
8888
cobj = Codec(codec, "w")
89-
except av.codec.codec.UnknownCodecError:
89+
except bv.codec.codec.UnknownCodecError:
9090
log.error(f"Unknown encoder: {codec}")
9191
# Normalize encoder names
9292
if cobj.id not in (Codec(x, "w").id for x in ctr.vcodecs):
@@ -103,7 +103,7 @@ def set_audio_codec(
103103
codec = "aac"
104104
else:
105105
codec = src.audios[0].codec
106-
if av.Codec(codec, "w").audio_formats is None:
106+
if bv.Codec(codec, "w").audio_formats is None:
107107
codec = "aac"
108108
if codec not in ctr.acodecs and ctr.default_aud != "none":
109109
codec = ctr.default_aud
@@ -114,7 +114,7 @@ def set_audio_codec(
114114
if ctr.acodecs is None or codec not in ctr.acodecs:
115115
try:
116116
cobj = Codec(codec, "w")
117-
except av.codec.codec.UnknownCodecError:
117+
except bv.codec.codec.UnknownCodecError:
118118
log.error(f"Unknown encoder: {codec}")
119119
# Normalize encoder names
120120
if cobj.id not in (Codec(x, "w").id for x in ctr.acodecs):
@@ -292,12 +292,12 @@ def make_media(tl: v3, output_path: str) -> None:
292292
if mov_flags:
293293
options["movflags"] = "+".join(mov_flags)
294294

295-
output = av.open(output_path, "w", container_options=options)
295+
output = bv.open(output_path, "w", container_options=options)
296296

297297
# Setup video
298298
if ctr.default_vid != "none" and tl.v:
299299
vframes = render_av(output, tl, args, log)
300-
output_stream: av.VideoStream | None
300+
output_stream: bv.VideoStream | None
301301
output_stream = next(vframes) # type: ignore
302302
else:
303303
output_stream, vframes = None, iter([])
@@ -315,15 +315,15 @@ def make_media(tl: v3, output_path: str) -> None:
315315

316316
if audio_paths:
317317
try:
318-
audio_encoder = av.Codec(args.audio_codec, "w")
319-
except av.FFmpegError as e:
318+
audio_encoder = bv.Codec(args.audio_codec, "w")
319+
except bv.FFmpegError as e:
320320
log.error(e)
321321
if audio_encoder.audio_formats is None:
322322
log.error(f"{args.audio_codec}: No known audio formats avail.")
323323
audio_format = audio_encoder.audio_formats[0]
324324
resampler = AudioResampler(format=audio_format, layout="stereo", rate=tl.sr)
325325

326-
audio_streams: list[av.AudioStream] = []
326+
audio_streams: list[bv.AudioStream] = []
327327
audio_inputs = []
328328
audio_gen_frames = []
329329
for i, audio_path in enumerate(audio_paths):
@@ -333,7 +333,7 @@ def make_media(tl: v3, output_path: str) -> None:
333333
rate=tl.sr,
334334
time_base=Fraction(1, tl.sr),
335335
)
336-
if not isinstance(audio_stream, av.AudioStream):
336+
if not isinstance(audio_stream, bv.AudioStream):
337337
log.error(f"Not a known audio codec: {args.audio_codec}")
338338

339339
if args.audio_bitrate != "auto":
@@ -345,7 +345,7 @@ def make_media(tl: v3, output_path: str) -> None:
345345
audio_stream.metadata["language"] = src.audios[i].lang # type: ignore
346346

347347
audio_streams.append(audio_stream)
348-
audio_input = av.open(audio_path)
348+
audio_input = bv.open(audio_path)
349349
audio_inputs.append(audio_input)
350350
audio_gen_frames.append(audio_input.decode(audio=0))
351351

@@ -360,7 +360,7 @@ def make_media(tl: v3, output_path: str) -> None:
360360
sub_gen_frames = []
361361

362362
for i, sub_path in enumerate(sub_paths):
363-
subtitle_input = av.open(sub_path)
363+
subtitle_input = bv.open(sub_path)
364364
subtitle_inputs.append(subtitle_input)
365365
subtitle_stream = output.add_stream_from_template(
366366
subtitle_input.streams.subtitles[0]
@@ -489,14 +489,14 @@ def __eq__(self, other):
489489
output.mux(item.stream.encode(item.frame))
490490
elif frame_type == "subtitle":
491491
output.mux(item.frame)
492-
except av.error.ExternalError:
492+
except bv.error.ExternalError:
493493
log.error(
494494
f"Generic error for encoder: {item.stream.name}\n"
495495
f"at {item.index} time_base\nPerhaps video quality settings are too low?"
496496
)
497-
except av.FileNotFoundError:
497+
except bv.FileNotFoundError:
498498
log.error(f"File not found: {output_path}")
499-
except av.FFmpegError as e:
499+
except bv.FFmpegError as e:
500500
log.error(e)
501501

502502
if bar_index:

0 commit comments

Comments
 (0)