前言
imageio是一个比较好用的用于读写图片数据的Python library,在处理视频数据时是以imageio_ffmpeg为backend的。
问题
当使用imageio读写视频时,其会调用imageio_ffmpeg包以使用ffmpeg作为backend。而其自带的ffmpeg只支持CPU,不支持GPU编解码加速。
深入到imageio_ffmpeg所在位置,例如~/.conda/envs/env_name/lib/python3.7/site-packages/imageio_ffmpeg/binaries
,可以看到目录下有一个名为“ffmpeg-linux64-v4.2.2”的二进制文件,这就是预编译好的FFmpeg。
如果需要支持GPU加速,则需要我们先安装好GPU版FFmpeg(见参考资料[2]),然后在上述目录建立GPU版FFmpeg的软链接。
# 切换到目录
cd ~/.conda/envs/env_name/lib/python3.7/site-packages/imageio_ffmpeg/binaries
# 备份imageio_ffmpeg自带的cpu版本ffmpeg
cp ffmpeg-linux64-v4.2.2 ffmpeg-linux64-v4.2.2-bak
# 建立gpu版本ffmpeg软链接
ln -s /usr/bin/ffmpeg ffmpeg-linux64-v4.2.2
使用
import imageio
video_path = 'test.mp4'
video_reader = imageio.get_reader(video_path, 'ffmpeg', ffmpeg_params=['-c:v', 'h264_cuvid'])
frame_list = []
for i, frame in enumerate(video_reader):
frame_list.append(frame)
imageio.mimsave('out.mp4', frame_list)
参考资料
[1] imageio - Python library for reading and writing image data
[2] Ubuntu上安装ffmpeg-cuda加速
[3] github - imageio/imageio
[4] imageio · PyPI
[5] Ubuntu上安装ffmpeg
[6] ffmpeg: you are trying to apply an input option to an output file or vice versa. Move this option before the file it belongs to. · Issue #294 · imageio/imageio