Spaces:
Runtime error
Runtime error
| # coding=utf-8 | |
| # Copyright 2020 The Google AI Perception Team Authors. | |
| # | |
| # Licensed under the Apache License, Version 2.0 (the "License"); | |
| # you may not use this file except in compliance with the License. | |
| # You may obtain a copy of the License at | |
| # | |
| # http://www.apache.org/licenses/LICENSE-2.0 | |
| # | |
| # Unless required by applicable law or agreed to in writing, software | |
| # distributed under the License is distributed on an "AS IS" BASIS, | |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| # See the License for the specific language governing permissions and | |
| # limitations under the License. | |
| """Utils for AIST++ Dataset.""" | |
| import os | |
| import ffmpeg | |
| import numpy as np | |
| def ffmpeg_video_read(video_path, fps=None): | |
| """Video reader based on FFMPEG. | |
| This function supports setting fps for video reading. It is critical | |
| as AIST++ Dataset are constructed under exact 60 fps, while some of | |
| the AIST dance videos are not percisely 60 fps. | |
| Args: | |
| video_path: A video file. | |
| fps: Use specific fps for video reading. (optional) | |
| Returns: | |
| A `np.array` with the shape of [seq_len, height, width, 3] | |
| """ | |
| assert os.path.exists(video_path), f'{video_path} does not exist!' | |
| try: | |
| probe = ffmpeg.probe(video_path) | |
| except ffmpeg.Error as e: | |
| print('stdout:', e.stdout.decode('utf8')) | |
| print('stderr:', e.stderr.decode('utf8')) | |
| raise e | |
| video_info = next(stream for stream in probe['streams'] | |
| if stream['codec_type'] == 'video') | |
| width = int(video_info['width']) | |
| height = int(video_info['height']) | |
| stream = ffmpeg.input(video_path) | |
| if fps: | |
| stream = ffmpeg.filter(stream, 'fps', fps=fps, round='up') | |
| stream = ffmpeg.output(stream, 'pipe:', format='rawvideo', pix_fmt='rgb24') | |
| out, _ = ffmpeg.run(stream, capture_stdout=True) | |
| out = np.frombuffer(out, np.uint8).reshape([-1, height, width, 3]) | |
| return out.copy() | |
| def ffmpeg_video_write(data, video_path, fps=25): | |
| """Video writer based on FFMPEG. | |
| Args: | |
| data: A `np.array` with the shape of [seq_len, height, width, 3] | |
| video_path: A video file. | |
| fps: Use specific fps for video writing. (optional) | |
| """ | |
| assert len(data.shape) == 4, f'input shape is not valid! Got {data.shape}!' | |
| _, height, width, _ = data.shape | |
| os.makedirs(os.path.dirname(video_path), exist_ok=True) | |
| writer = ( | |
| ffmpeg | |
| .input('pipe:', framerate=fps, format='rawvideo', | |
| pix_fmt='rgb24', s='{}x{}'.format(width, height)) | |
| .output(video_path, pix_fmt='yuv420p') | |
| .overwrite_output() | |
| .run_async(pipe_stdin=True) | |
| ) | |
| for frame in data: | |
| writer.stdin.write(frame.astype(np.uint8).tobytes()) | |
| writer.stdin.close() | |