|
|
|
# Operator: video-decoder
|
|
|
|
|
|
|
|
Author: JunJie Jiang
|
|
|
|
|
|
|
|
## Overview
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## Interface
|
|
|
|
|
|
|
|
```python
|
|
|
|
__init__(self, start_time=None, end_time=None, sample_type=None, args=None)
|
|
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
|
|
|
- start_time: float
|
|
|
|
|
|
|
|
- end_time: float
|
|
|
|
|
|
|
|
decode video from start_time to end_time
|
|
|
|
|
|
|
|
- sample_type: str
|
|
|
|
|
|
|
|
uniform_temporal_subsample
|
|
|
|
time_step_sample
|
|
|
|
|
|
|
|
- args: dict
|
|
|
|
sample_type is `uniform_temporal_subsample`
|
|
|
|
num_samples: int
|
|
|
|
|
|
|
|
sample_type is `time_step_sample`
|
|
|
|
time_step: int
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
__call__(self, video_path: str)
|
|
|
|
```
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
|
|
|
- video_path:
|
|
|
|
support local path and http/https url.
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
|
|
- towhee.types.VideoFrame
|
|
|
|
|
|
|
|
## Requirements
|
|
|
|
av
|
|
|
|
|
|
|
|
|
|
|
|
## How it works
|
|
|
|
```python
|
|
|
|
from towhee import pipe, ops, DataCollection
|
|
|
|
|
|
|
|
p = (
|
|
|
|
pipe.input('video_file')
|
|
|
|
.flat_map('video_file', 'frame', ops.video_decode.ffmpeg(start_time=10.0, end_time=15.0, sample_type='time_step_sample', args={'time_step': 1}))
|
|
|
|
.output('frame')
|
|
|
|
)
|
|
|
|
|
|
|
|
DataCollection(p('./video.mp4')).show(limit=1)
|
|
|
|
```
|
|
|
|
|
|
|
|
```python
|
|
|
|
from towhee import ops
|
|
|
|
|
|
|
|
d = ops.video_decode.ffmpeg(start_time=10.0, end_time=20.0, sample_type='uniform_temporal_subsample', args={'num_samples': 10})
|
|
|
|
for frame in d(video_path):
|
|
|
|
print(frame)
|
|
|
|
|
|
|
|
print('#' * 50)
|
|
|
|
|
|
|
|
d = ops.video_decode.ffmpeg(start_time=10.0, end_time=20.0, sample_type='time_step_sample', args={'time_step': 1})
|
|
|
|
for frame in d(video_path):
|
|
|
|
print(frame)
|
|
|
|
|
|
|
|
|
|
|
|
result:
|
|
|
|
VideoFrame shape: (360, 480, 3), mode: RGB, timestamp: 10010, key_frame: 1
|
|
|
|
VideoFrame shape: (360, 480, 3), mode: RGB, timestamp: 11078, key_frame: 0
|
|
|
|
VideoFrame shape: (360, 480, 3), mode: RGB, timestamp: 12145, key_frame: 0
|
|
|
|
VideoFrame shape: (360, 480, 3), mode: RGB, timestamp: 13280, key_frame: 0
|
|
|
|
VideoFrame shape: (360, 480, 3), mode: RGB, timestamp: 14348, key_frame: 0
|
|
|
|
VideoFrame shape: (360, 480, 3), mode: RGB, timestamp: 15482, key_frame: 0
|
|
|
|
VideoFrame shape: (360, 480, 3), mode: RGB, timestamp: 16550, key_frame: 0
|
|
|
|
VideoFrame shape: (360, 480, 3), mode: RGB, timestamp: 17684, key_frame: 0
|
|
|
|
VideoFrame shape: (360, 480, 3), mode: RGB, timestamp: 18752, key_frame: 0
|
|
|
|
VideoFrame shape: (360, 480, 3), mode: RGB, timestamp: 19887, key_frame: 0
|
|
|
|
##################################################
|
|
|
|
VideoFrame shape: (360, 480, 3), mode: RGB, timestamp: 10010, key_frame: 1
|
|
|
|
VideoFrame shape: (360, 480, 3), mode: RGB, timestamp: 11011, key_frame: 0
|
|
|
|
VideoFrame shape: (360, 480, 3), mode: RGB, timestamp: 12012, key_frame: 0
|
|
|
|
VideoFrame shape: (360, 480, 3), mode: RGB, timestamp: 13013, key_frame: 0
|
|
|
|
VideoFrame shape: (360, 480, 3), mode: RGB, timestamp: 14014, key_frame: 0
|
|
|
|
VideoFrame shape: (360, 480, 3), mode: RGB, timestamp: 15015, key_frame: 1
|
|
|
|
VideoFrame shape: (360, 480, 3), mode: RGB, timestamp: 16015, key_frame: 0
|
|
|
|
VideoFrame shape: (360, 480, 3), mode: RGB, timestamp: 17017, key_frame: 0
|
|
|
|
VideoFrame shape: (360, 480, 3), mode: RGB, timestamp: 18018, key_frame: 0
|
|
|
|
VideoFrame shape: (360, 480, 3), mode: RGB, timestamp: 19019, key_frame: 0
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## Reference
|
|
|
|
|