3b1b / manim

Animation engine for explanatory math videos
MIT License
71.55k stars 6.28k forks source link

BrokenPipeError: [Errno 32] Broken pipe #669

Open itspacchu opened 5 years ago

itspacchu commented 5 years ago

When i run python3 -m manim example_scenes.py SquareToCircle -pl

this is what i get Animation 0: ShowCreationSquare: 0%| | 0/15 [00:00<?, ?it/s]/home/pacchu/_temp.local/share/Trash/files/manim/media/videos/example_scenes/480p15/partial_movie_files/SquareToCircle/00000_temp.mp4: No such file or directory

Traceback (most recent call last): File "/home/pacchu/.local/share/Trash/files/manim/manimlib/extract_scene.py", line 153, in main scene = SceneClass(*scene_kwargs) File "/home/pacchu/.local/share/Trash/files/manim/manimlib/scene/scene.py", line 54, in init self.construct() File "example_scenes.py", line 81, in construct self.play(ShowCreation(square)) File "/home/pacchu/.local/share/Trash/files/manim/manimlib/scene/scene.py", line 449, in wrapper func(self, args, **kwargs) File "/home/pacchu/.local/share/Trash/files/manim/manimlib/scene/scene.py", line 484, in play self.add_frames(self.get_frame()) File "/home/pacchu/.local/share/Trash/files/manim/manimlib/scene/scene.py", line 570, in add_frames self.file_writer.write_frame(frame) File "/home/pacchu/.local/share/Trash/files/manim/manimlib/scene/scene_file_writer.py", line 171, in write_frame self.writing_process.stdin.write(frame.tostring()) BrokenPipeError: [Errno 32] Broken pipe

MrJarnould commented 5 years ago

same

wknowleskellett commented 5 years ago

Above that, does it say Unknown encoder 'libx264'?

wknowleskellett commented 5 years ago

Above that, does it say Unknown encoder 'libx264'?

My guess is that when you run ffmpeg -codecs 2> /dev/null | grep -e 264 that none of the lines contain 'libx264', but that there is still output. Basically, I got this problem because ffmpeg (used by manim) would fail to generate the video as requested and close, causing your broken pipe.

I see two possible solutions -

  1. For individuals with this problem: If my above command produced output for you which included the name of a codec (i.e. 'h264', change line 246 in ./manim/manimlib/scene/scene_file_writer.py from '-vcodec', 'libx264' to '-vcodec', 'the_codec_name_you_found'. This solved the problem for me (I used 'h264')
  2. For the overall repository, maybe we change the installation requirements somehow to make sure you have libx264 installed. This, or if it turns out everyone should have one called h264, the master could be updated to use h264.
tommyhayes100814 commented 5 years ago

Changing '-vcodec', 'libx264' to '-vcodec', 'h264' worked for me.

I am currently running Catalina 10.15.1 on 2017 13-Inch Macbook Pro.

Fillot commented 4 years ago

Same problem here.

running python3 -m manim example_scenes.py SquareToCircle -pl

outputs

Media will be written to ./media/. You can change this behavior with the --media_dir flag. Animation 0: ShowCreationSquare: 0%| | 0/15 [00:00<?, ?it/s]Unknown encoder 'h264'

Traceback (most recent call last): File "/home/tom/manim/manimlib/extract_scene.py", line 155, in main scene = SceneClass(*scene_kwargs) File "/home/tom/manim/manimlib/scene/scene.py", line 53, in init self.construct() File "example_scenes.py", line 83, in construct self.play(ShowCreation(square)) File "/home/tom/manim/manimlib/scene/scene.py", line 406, in wrapper func(self, args, **kwargs) File "/home/tom/manim/manimlib/scene/scene.py", line 463, in play self.progress_through_animations(animations) File "/home/tom/manim/manimlib/scene/scene.py", line 439, in progress_through_animations self.add_frames(self.get_frame()) File "/home/tom/manim/manimlib/scene/scene.py", line 543, in add_frames self.file_writer.write_frame(frame) File "/home/tom/manim/manimlib/scene/scene_file_writer.py", line 185, in write_frame self.writing_process.stdin.write(frame.tostring()) BrokenPipeError: [Errno 32] Broken pipe

while ffmpeg -codecs 2> /dev/null | grep -e 264

outputs

D.V.LS h264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10

Changing line 246 to either h264 or H.264 did not solve the issue. This is running on Ubuntu 18.04

haykh commented 4 years ago

In case this is useful for anyone /also developers might wanna consider adding this feature/. I hacked around a little bit and added a flag argument to specify the codec used. First add inline argument parser in the manimlib/config.py.

# ... in `parse_cli()`
        parser.add_argument(
            "--vcodec",
            help="Specify the codec used to render video"
        )
# ... in `get_configuration(args)`
    file_writer_config = {
        # ...
        "vcodec": args.vcodec
    }
# ...

Now in manimlib/scene/scene_file_writer.py

        if self.movie_file_extension == ".mov":
            # ...
        else:
            command += [
                '-vcodec', self.vcodec, # <- change to this line
                '-pix_fmt', 'yuv420p',
            ]

Now you can specify --vcodec h264 or whatever you wish when rendering. This also works when using manim in jupyter with this neat library.

PS. You could probably even add a default vcodec, so that you don't have to specify it every time, but I was a bit lazy to do that.

PPS. As was pointed out above, you can view all the available codecs (not only video enconding) by doing this: ffmpeg -codecs 2> /dev/null.

PPPS. On MacOS I actually had the best quality when rendering with the --vcodec prores. It adds up a lot in file weight, but the quality is superb.

PPPPS. If you're using conda version (hopefully in a separate environment), you'll find the library here: ~/anaconda3/envs/<ENVNAME>/lib/python3.7/site-packages/manimlib.

KokeCacao commented 4 years ago

Same problem here.

running python3 -m manim example_scenes.py SquareToCircle -pl

outputs

Media will be written to ./media/. You can change this behavior with the --media_dir flag. Animation 0: ShowCreationSquare: 0%| | 0/15 [00:00<?, ?it/s]Unknown encoder 'h264' Traceback (most recent call last): File "/home/tom/manim/manimlib/extract_scene.py", line 155, in main scene = SceneClass(scene_kwargs) File "/home/tom/manim/manimlib/scene/scene.py", line 53, in init* self.construct() File "example_scenes.py", line 83, in construct self.play(ShowCreation(square)) File "/home/tom/manim/manimlib/scene/scene.py", line 406, in wrapper func(self, args, **kwargs) File "/home/tom/manim/manimlib/scene/scene.py", line 463, in play self.progress_through_animations(animations) File "/home/tom/manim/manimlib/scene/scene.py", line 439, in progress_through_animations self.add_frames(self.get_frame()) File "/home/tom/manim/manimlib/scene/scene.py", line 543, in add_frames self.file_writer.write_frame(frame) File "/home/tom/manim/manimlib/scene/scene_file_writer.py", line 185, in write_frame self.writing_process.stdin.write(frame.tostring()) BrokenPipeError: [Errno 32] Broken pipe

while ffmpeg -codecs 2> /dev/null | grep -e 264

outputs

D.V.LS h264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10

Changing line 246 to either h264 or H.264 did not solve the issue. This is running on Ubuntu 18.04

On my Ubuntu 18.04, using h264 failed, but using prores worked!

amilapsn commented 4 years ago

https://stackoverflow.com/a/58421346/4146678 For conda peple

whliao5am commented 4 years ago

https://stackoverflow.com/a/58421346/4146678 For conda peple

conda install x264=='1!152.20180717' ffmpeg=4.0.2 -c conda-forge

work for me

anisghaoui commented 4 years ago

I had the same problem when installing manim through pip3 on Ubuntu 18.04. It solved itself by simply uninstalling manimlib then ffmpeg : pip3 uninstall manimlib sudo apt --purge remove ffmpeg sudo apt autoremove

then check if you can start ffmpeg from your terminal. if so you need to delete it manually : wheresis ffmpeg should print : /usr/bin/ffmpeg sudo rm /usr/bin/ffmpeg or whatever got printed

you can now optionally reboot now.

sudo apt install ffmpeg pip3 install manimlib

try the example scene now.

jason-c-kwan commented 4 years ago

I was having this problem whenever trying to render 4K with the manim Docker image. I managed to fix it by using the libx265 codec, although it still seems to give the "broken pipe" error sometimes. I thought I'd leave this comment here in case others run into the same issue.

raufie commented 3 years ago

I had this problem too. I was using another version of FFMPEG for another application that I was developing, and after I removed that ffmpeg from the PATH variable, every thing started working again.

geniuspanada commented 2 years ago

Changing '-vcodec', 'libx264' to '-vcodec', 'h264' worked for me.

I am currently running Catalina 10.15.1 on 2017 13-Inch Macbook Pro.

YES,I tried it and successfully solved it.

langford commented 2 years ago

Installing the codec via conda (if you happen to have that) also seems to resolve this issue for me. It allows specification of the compile flags for ffmpeg to get the same codec that the code expects

from https://stackoverflow.com/questions/65460436/how-to-enable-libx264-for-ffmpeg-on-macos

conda install -c conda-forge x264=='1!161.3030' ffmpeg=4.3

boring180 commented 1 month ago

I changed it to 'h264', but this new error message appears:

[AVFilterGraph @ 0x14d704870] No such filter: 'eq' [vost#0:0/libopenh264 @ 0x14e006990] Error initializing a simple filtergraph Error opening output file /Users/xuborong/Downloads/SquareToCircle_temp.mp4. Error opening output files: Filter not found