29
29
import subprocess
30
30
import sys
31
31
from tempfile import TemporaryDirectory
32
+ import tempfile
32
33
import uuid
33
34
34
35
import numpy as np
@@ -424,7 +425,7 @@ def __init__(self, *args, **kwargs):
424
425
self .frame_format = rcParams ['animation.frame_format' ]
425
426
426
427
def setup (self , fig , outfile , dpi = None , frame_prefix = '_tmp' ,
427
- clear_temp = True ):
428
+ clear_temp = True , frame_dir = None ):
428
429
'''Perform setup for writing the movie file.
429
430
430
431
Parameters
@@ -444,7 +445,9 @@ def setup(self, fig, outfile, dpi=None, frame_prefix='_tmp',
444
445
If the temporary files should be deleted after stitching
445
446
the final result. Setting this to ``False`` can be useful for
446
447
debugging. Defaults to ``True``.
447
-
448
+ frame_dir : str or None, optional
449
+ Directory where the temporary files are saved. None means that a
450
+ new directory is created.
448
451
'''
449
452
self .fig = fig
450
453
self .outfile = outfile
@@ -453,8 +456,18 @@ def setup(self, fig, outfile, dpi=None, frame_prefix='_tmp',
453
456
self .dpi = dpi
454
457
self ._adjust_frame_size ()
455
458
459
+ self .created_dir = None
460
+ if frame_dir is None :
461
+ tempfile .tempdir = ''
462
+ frame_dir = tempfile .mkdtemp ()
463
+ self .created_dir = frame_dir
464
+ elif not os .path .exists (frame_dir ) and frame_dir :
465
+ os .makedirs (frame_dir )
466
+ self .created_dir = frame_dir
467
+
468
+ self .temp_prefix = os .path .join (frame_dir , frame_prefix )
469
+
456
470
self .clear_temp = clear_temp
457
- self .temp_prefix = frame_prefix
458
471
self ._frame_counter = 0 # used for generating sequential file names
459
472
self ._temp_names = list ()
460
473
self .fname_format_str = '%s%%07d.%s'
@@ -542,7 +555,11 @@ def cleanup(self):
542
555
self ._temp_names )
543
556
for fname in self ._temp_names :
544
557
os .remove (fname )
545
-
558
+ if self .created_dir :
559
+ try :
560
+ os .rmdir (self .created_dir )
561
+ except OSError :
562
+ pass
546
563
547
564
@writers .register ('pillow' )
548
565
class PillowWriter (MovieWriter ):
@@ -597,7 +614,9 @@ class FFMpegBase(object):
597
614
598
615
@property
599
616
def output_args (self ):
600
- args = ['-vcodec' , self .codec ]
617
+ args = []
618
+ if self .codec :
619
+ args .extend (['-vcodec' , self .codec ])
601
620
# For h264, the default format is yuv444p, which is not compatible
602
621
# with quicktime (and others). Specifying yuv420p fixes playback on
603
622
# iOS,as well as HTML5 video in firefox and safari (on both Win and
@@ -665,8 +684,7 @@ def _args(self):
665
684
# Returns the command line parameters for subprocess to use
666
685
# ffmpeg to create a movie using a collection of temp images
667
686
return [self .bin_path (), '-r' , str (self .fps ),
668
- '-i' , self ._base_temp_name (),
669
- '-vframes' , str (self ._frame_counter )] + self .output_args
687
+ '-i' , self ._base_temp_name ()] + self .output_args
670
688
671
689
672
690
# Base class of avconv information. AVConv has identical arguments to FFMpeg.
@@ -855,13 +873,12 @@ def setup(self, fig, outfile, dpi, frame_dir=None):
855
873
if not self .embed_frames :
856
874
if frame_dir is None :
857
875
frame_dir = root + '_frames'
858
- if not os .path .exists (frame_dir ):
859
- os .makedirs (frame_dir )
860
- frame_prefix = os .path .join (frame_dir , 'frame' )
861
876
else :
862
- frame_prefix = None
877
+ frame_dir = ''
878
+ frame_prefix = 'frame'
863
879
864
- super ().setup (fig , outfile , dpi , frame_prefix , clear_temp = False )
880
+ super ().setup (fig , outfile , dpi , frame_prefix , clear_temp = False ,
881
+ frame_dir = frame_dir )
865
882
866
883
def grab_frame (self , ** savefig_kwargs ):
867
884
if self .embed_frames :
0 commit comments