Mac Intel环境下mediapy无法识别已安装ffmpeg问题求助
MuJoCo+mediapy无法识别Mac Intel上已安装的ffmpeg问题
正在开展一个AI项目,使用开源物理仿真软件MuJoCo(偏向强化学习方向),采用Python开发。
遇到的问题:MuJoCo依赖mediapy库实现帧序列(视频)可视化,而mediapy又依赖ffmpeg,但mediapy无法识别我Mac Intel电脑上已安装的ffmpeg。查看mediapy源码后,发现它通过以下代码检测ffmpeg是否安装:
import shutil import typing import os _Path = typing.Union[str, 'os.PathLike[str]'] class _Config: ffmpeg_name_or_path: _Path = 'ffmpeg' show_save_dir: _Path | None = None _config = _Config() def _search_for_ffmpeg_path() -> str | None: """Returns a path to the ffmpeg program, or None if not found.""" if filename := shutil.which(_config.ffmpeg_name_or_path): return str(filename) return None
我在conda环境的库目录opt/anaconda3/envs/myenv/lib/python3.10/site-packages中找到了ffmpeg文件夹,但运行上述检测代码却返回None。
触发问题的代码如下:
tippe_top = """ <mujoco model="tippe top"> <option integrator="RK4"/> <asset> <texture name="grid" type="2d" builtin="checker" rgb1=".1 .2 .3" rgb2=".2 .3 .4" width="300" height="300"/> <material name="grid" texture="grid" texrepeat="8 8" reflectance=".2"/> </asset> <worldbody> <geom size=".2 .2 .01" type="plane" material="grid"/> <light pos="0 0 .6"/> <camera name="closeup" pos="0 -.1 .07" xyaxes="1 0 0 0 1 2"/> <body name="top" pos="0 0 .02"> <freejoint/> <geom name="ball" type="sphere" size=".02" /> <geom name="stem" type="cylinder" pos="0 0 .02" size="0.004 .008"/> <geom name="ballast" type="box" size=".023 .023 0.005" pos="0 0 -.015" contype="0" conaffinity="0" group="3"/> </body> </worldbody> <keyframe> <key name="spinning" qpos="0 0 0.02 1 0 0 0" qvel="0 0 0 0 1 200" /> </keyframe> </mujoco> """ model = mujoco.MjModel.from_xml_string(tippe_top) renderer = mujoco.Renderer(model) data = mujoco.MjData(model) duration = 7 # (seconds) framerate = 60 # (Hz) # Simulate and display video. frames = [] mujoco.mj_resetDataKeyframe(model, data, 0) # Reset the state to keyframe 0 while data.time < duration: mujoco.mj_step(model, data) if len(frames) < data.time * framerate: renderer.update_scene(data, "closeup") pixels = renderer.render() frames.append(pixels) media.show_video(frames, fps=framerate)
报错信息如下:
{ "name": "RuntimeError", "message": "Program 'ffmpeg' is not found; perhaps install ffmpeg using 'apt install ffmpeg'.", "stack": "--------------------------------------------------------------------------- RuntimeError Traceback (most recent call last) Cell In[4], line 14 11 pixels = renderer.render() 12 frames.append(pixels) ---> 14 media.show_video(frames, fps=framerate) File ~/opt/anaconda3/envs/Exjobb/lib/python3.10/site-packages/mediapy/__init__.py:1858, in show_video(images, title, **kwargs) 1835 def show_video( 1836 images: Iterable[_NDArray], *, title: str | None = None, **kwargs: Any 1837 ) -> str | None: 1838 """Displays a video in the IPython notebook and optionally saves it to a file. 1839 1840 See `show_videos`. (...) 1856 html string if `return_html` is `True`. 1857 """ -> 1858 return show_videos([images], [title], **kwargs) File ~/opt/anaconda3/envs/Exjobb/lib/python3.10/site-packages/mediapy/__init__.py:1940, in show_videos(videos, titles, width, height, downsample, columns, fps, bps, qp, codec, ylabel, html_class, return_html, **kwargs) 1938 video = [resize_image(image, (h, w)) for image in video] 1939 first_image = video[0] -> 1940 data = compress_video( 1941 video, metadata=metadata, fps=fps, bps=bps, qp=qp, codec=codec 1942 ) 1943 if title is not None and _config.show_save_dir: 1944 suffix = _filename_suffix_from_codec(codec) File ~/opt/anaconda3/envs/Exjobb/lib/python3.10/site-packages/mediapy/__init__.py:1777, in compress_video(images, codec, **kwargs) 1775 with tempfile.TemporaryDirectory() as directory_name: 1776 tmp_path = pathlib.Path(directory_name) / f'file{suffix}' -> 1777 write_video(tmp_path, images, codec=codec, **kwargs) 1778 return tmp_path.read_bytes() File ~/opt/anaconda3/envs/Exjobb/lib/python3.10/site-packages/mediapy/__init__.py:1747, in write_video(path, images, **kwargs) 1745 dtype = np.dtype(np.uint16) 1746 kwargs = {'metadata': getattr(images, 'metadata', None), **kwargs} -> 1747 with VideoWriter(path, shape=shape, dtype=dtype, **kwargs) as writer: 1748 for image in images: 1749 writer.add_image(image) File ~/opt/anaconda3/envs/Exjobb/lib/python3.10/site-packages/mediapy/__init__.py:1567, in VideoWriter.__enter__(self) 1566 def __enter__(self) -> 'VideoWriter': -> 1567 ffmpeg_path = _get_ffmpeg_path() 1568 input_pix_fmt = self._get_pix_fmt(self.dtype, self.input_format) 1569 try: File ~/opt/anaconda3/envs/Exjobb/lib/python3.10/site-packages/mediapy/__init__.py:1167, in _get_ffmpeg_path() 1165 path = _search_for_ffmpeg_path() 1166 if not path: -> 1167 raise RuntimeError( 1168 f"Program '{_config.ffmpeg_name_or_path}' is not found;" 1169 " perhaps install ffmpeg using 'apt install ffmpeg'." 1170 ) 1171 return path RuntimeError: Program 'ffmpeg' is not found; perhaps install ffmpeg using 'apt install ffmpeg'." }
已尝试的解决方法:
- 修改shutil.which查找的文件名
- 重装相关库
- 更换ffmpeg相关库(ffmpeg-python v0.2、imageio_ffmpeg v0.4.9)
以上方法均未解决问题,恳请提供帮助。
内容的提问来源于stack exchange,提问作者Alexander Sellin
相关产品推荐
相关产品推荐

