Skip to content

Commit 00e1130

Browse files
author
anna-charlotte
committed
feat: display video and add pydub to pyproject toml
Signed-off-by: anna-charlotte <[email protected]>
1 parent 7e16f53 commit 00e1130

File tree

5 files changed

+93
-1
lines changed

5 files changed

+93
-1
lines changed

docarray/typing/tensor/audio/abstract_audio_tensor.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from typing import BinaryIO, TypeVar, Union
44

55
from docarray.typing.tensor.abstract_tensor import AbstractTensor
6+
from docarray.utils.misc import is_notebook
67

78
T = TypeVar('T', bound='AbstractAudioTensor')
89

@@ -40,3 +41,35 @@ def save_to_wav_file(
4041
f.setsampwidth(sample_width)
4142
f.setframerate(sample_rate)
4243
f.writeframes(self.to_bytes())
44+
45+
def display(self, rate=44100):
46+
audio_np = self.get_comp_backend().to_numpy(self)
47+
if is_notebook():
48+
from IPython.display import Audio, display
49+
50+
display(Audio(audio_np, rate=rate))
51+
else:
52+
# b = self.load()
53+
# res = requests.get(self)
54+
# print(f"type(res.text) = {type(res.text)}")
55+
# print(f"type(res.content) = {type(res.content)}")
56+
# sound = AudioSegment.from_file(BytesIO(res.content), "wav")
57+
# sound = AudioSegment.from_file(self, format="wav")
58+
import os
59+
import tempfile
60+
61+
# sound = AudioSegment.from_file(self, format="wav")
62+
# raise NotImplementedError
63+
# from io import BytesIO
64+
# import requests
65+
from pydub import AudioSegment
66+
from pydub.playback import play
67+
68+
tmp = tempfile.NamedTemporaryFile(delete=False)
69+
try:
70+
self.save_to_wav_file(tmp)
71+
sound = AudioSegment.from_file(tmp, "wav")
72+
play(sound)
73+
finally:
74+
tmp.close()
75+
os.unlink(tmp.name)

docarray/typing/tensor/video/video_tensor_mixin.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,3 +109,9 @@ class MyDoc(BaseDocument):
109109

110110
for packet in stream_video.encode(None):
111111
container.mux(packet)
112+
113+
def display(self) -> None:
114+
"""
115+
Display video data from tensor.
116+
"""
117+
raise NotImplementedError

docarray/typing/url/video_url.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from docarray.typing.tensor.ndarray import NdArray
99
from docarray.typing.tensor.video import VideoNdArray
1010
from docarray.typing.url.any_url import AnyUrl
11+
from docarray.utils.misc import is_notebook
1112

1213
if TYPE_CHECKING:
1314
from pydantic import BaseConfig
@@ -130,3 +131,40 @@ class MyDoc(BaseDocument):
130131
indices = parse_obj_as(NdArray, keyframe_indices)
131132

132133
return VideoLoadResult(video=video, audio=audio, key_frame_indices=indices)
134+
135+
def display(self):
136+
"""
137+
Play video from url.
138+
"""
139+
remote_url = True if self.startswith('http') else False
140+
141+
if is_notebook():
142+
from IPython.display import Video, display
143+
144+
if remote_url:
145+
display(Video(data=self))
146+
else:
147+
display(Video(filename=self))
148+
else:
149+
import pyglet
150+
151+
player = pyglet.media.Player()
152+
pyglet.media.StreamingSource()
153+
media = pyglet.media.load(self, streaming=True)
154+
player.queue(media)
155+
156+
width = player.source.video_format.width
157+
height = player.source.video_format.height
158+
title = self.split('/')[-1]
159+
window = pyglet.window.Window(width, height, title)
160+
161+
player.play()
162+
163+
@window.event
164+
def on_draw():
165+
window.clear()
166+
167+
if player.source and player.source.video_format:
168+
player.get_texture().blit(0, 0)
169+
170+
pyglet.app.run()

poetry.lock

Lines changed: 14 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,14 @@ types-requests = ">=2.28.11.6"
2020
av = {version = ">=10.0.0", optional = true}
2121
fastapi = {version = ">=0.87.0", optional = true }
2222
rich = ">=13.1.0"
23+
pydub = {version = "^0.25.1", optional = true }
2324

2425
[tool.poetry.extras]
2526
common = ["protobuf"]
2627
torch = ["torch"]
2728
image = ["pillow", "types-pillow"]
2829
video = ["av"]
30+
audio = ["pydub"]
2931
mesh = ["trimesh"]
3032
web = ["fastapi"]
3133

0 commit comments

Comments
 (0)