Mario
Mario

Reputation: 1966

How can fix CalledProcessError: in ffmpeg

I hope someone can help to troubleshoot this problem. I'm trying to save the loss plots out of Keras in the form of the following animation.

img

but I have been facing the following error, and ultimately I can't save the animation:

MovieWriter stderr:
[h264_v4l2m2m @ 0x55a67176f430] Could not find a valid device
[h264_v4l2m2m @ 0x55a67176f430] can't configure encoder
Error initializing output stream 0:0 -- Error while opening encoder for output stream #0:0 - maybe incorrect parameters such as bit_rate, rate, width or height

---------------------------------------------------------------------------
BrokenPipeError                           Traceback (most recent call last)
~/anaconda3/envs/CR7/lib/python3.6/site-packages/matplotlib/animation.py in saving(self, fig, outfile, dpi, *args, **kwargs)
    229         try:
--> 230             yield self
    231         finally:

~/anaconda3/envs/CR7/lib/python3.6/site-packages/matplotlib/animation.py in save(self, filename, writer, fps, dpi, codec, bitrate, extra_args, metadata, extra_anim, savefig_kwargs, progress_callback)
   1155                             frame_number += 1
-> 1156                     writer.grab_frame(**savefig_kwargs)
   1157 

~/anaconda3/envs/CR7/lib/python3.6/site-packages/matplotlib/animation.py in grab_frame(self, **savefig_kwargs)
    383         self.fig.savefig(self._frame_sink(), format=self.frame_format,
--> 384                          dpi=self.dpi, **savefig_kwargs)
    385 

~/anaconda3/envs/CR7/lib/python3.6/site-packages/matplotlib/figure.py in savefig(self, fname, transparent, **kwargs)
   2179 
-> 2180         self.canvas.print_figure(fname, **kwargs)
   2181 

~/anaconda3/envs/CR7/lib/python3.6/site-packages/matplotlib/backend_bases.py in print_figure(self, filename, dpi, facecolor, edgecolor, orientation, format, bbox_inches, **kwargs)
   2081                     bbox_inches_restore=_bbox_inches_restore,
-> 2082                     **kwargs)
   2083             finally:

~/anaconda3/envs/CR7/lib/python3.6/site-packages/matplotlib/backends/backend_agg.py in print_raw(self, filename_or_obj, *args, **kwargs)
    445                 cbook.open_file_cm(filename_or_obj, "wb") as fh:
--> 446             fh.write(renderer._renderer.buffer_rgba())
    447 

BrokenPipeError: [Errno 32] Broken pipe

During handling of the above exception, another exception occurred:

CalledProcessError                        Traceback (most recent call last)
<ipython-input-23-13442cbf583d> in <module>
     17 print(f'{model_type.upper()} Train Time: {Timer} sec')
     18 
---> 19 create_loss_animation(model_type, hist.history['loss'], hist.history['val_loss'], epoch)
     20 
     21 evaluate(model, trainX, trainY, testX, testY, scores_train, scores_test)

<ipython-input-22-199228cd4989> in create_loss_animation(model_type, loss_hist, val_loss_hist, epoch)
     34 
     35     ani = matplotlib.animation.FuncAnimation(fig, animate, fargs=(l1, l2, loss, val_loss, title), repeat=True, interval=1000, repeat_delay=1000)
---> 36     ani.save(f'loss_animation_{model_type}_oneDataset.mp4', writer=writer)

~/anaconda3/envs/CR7/lib/python3.6/site-packages/matplotlib/animation.py in save(self, filename, writer, fps, dpi, codec, bitrate, extra_args, metadata, extra_anim, savefig_kwargs, progress_callback)
   1154                             progress_callback(frame_number, total_frames)
   1155                             frame_number += 1
-> 1156                     writer.grab_frame(**savefig_kwargs)
   1157 
   1158         # Reconnect signal for first draw if necessary

~/anaconda3/envs/CR7/lib/python3.6/contextlib.py in __exit__(self, type, value, traceback)
     97                 value = type()
     98             try:
---> 99                 self.gen.throw(type, value, traceback)
    100             except StopIteration as exc:
    101                 # Suppress StopIteration *unless* it's the same exception that

~/anaconda3/envs/CR7/lib/python3.6/site-packages/matplotlib/animation.py in saving(self, fig, outfile, dpi, *args, **kwargs)
    230             yield self
    231         finally:
--> 232             self.finish()
    233 
    234 

~/anaconda3/envs/CR7/lib/python3.6/site-packages/matplotlib/animation.py in finish(self)
    365     def finish(self):
    366         '''Finish any processing for writing the movie.'''
--> 367         self.cleanup()
    368 
    369     def grab_frame(self, **savefig_kwargs):

~/anaconda3/envs/CR7/lib/python3.6/site-packages/matplotlib/animation.py in cleanup(self)
    409         if self._proc.returncode:
    410             raise subprocess.CalledProcessError(
--> 411                 self._proc.returncode, self._proc.args, out, err)
    412 
    413     @classmethod

CalledProcessError: Command '['/usr/bin/ffmpeg', '-f', 'rawvideo', '-vcodec', 'rawvideo', '-s', '720x720', '-pix_fmt', 
'rgba', '-r', '5', '-loglevel', 'error', '-i', 'pipe:', '-vcodec', 'h264', '-pix_fmt', 'yuv420p', '-b', '800k', '-y', 
'loss_animation_CNN_oneDataset.mp4']' returned non-zero exit status 1.

I tried to ignore the error by this answer but it seems it's not the case. I also checked similar case but its answer for getting a static git binary is not my cas as well since not especial converting PNG to MP4!

My code is as follows:

plt.rcParams['animation.ffmpeg_path'] = '/usr/bin/ffmpeg'

def animate(i, data1, data2, line1, line2):
    temp1 = data1.iloc[:int(i+1)]
    temp2 = data2.iloc[:int(i+1)]

    line1.set_data(temp1.index, temp1.value)
    line2.set_data(temp2.index, temp2.value)

    return (line1, line2)


def create_loss_animation(model_type, data1, data2):
    fig = plt.figure()
    plt.title(f'Loss on Train & Test', fontsize=25)
    plt.xlabel('Epoch', fontsize=20)
    plt.ylabel('Loss MSE for Sx-Sy & Sxy', fontsize=20)
    plt.xlim(min(data1.index.min(), data2.index.min()), max(data1.index.max(), data2.index.max()))
    plt.ylim(min(data1.value.min(), data2.value.min()), max(data1.value.max(), data2.value.max()))

    l1, = plt.plot([], [], 'o-', label='Train Loss', color='b', markevery=[-1])
    l2, = plt.plot([], [], 'o-', label='Test Loss', color='r', markevery=[-1])
    plt.legend(loc='center right', fontsize='xx-large')

    Writer = animation.writers['ffmpeg']
    writer = Writer(fps=5, bitrate=1800)

    ani = matplotlib.animation.FuncAnimation(fig, animate, fargs=(data1, data2, l1, l2), repeat=True, interval=1000, repeat_delay=1000)
    ani.save(f'{model_type}.mp4', writer=writer)

# create datasets
x = np.linspace(0,150,50)
y1 = 41*np.exp(-x/20)
y2 = 35*np.exp(-x/50)

my_data_number_1 = pd.DataFrame({'x':x, 'value':y1}).set_index('x')
my_data_number_2 = pd.DataFrame({'x':x, 'value':y2}).set_index('x')

create_loss_animation('test', my_data_number_1, my_data_number_2)

Upvotes: 3

Views: 7644

Answers (2)

Lynne212 Carlson89
Lynne212 Carlson89

Reputation: 11

It may be because the installed version is wrong, you can try and use the following installation package instead: https://www.pcsoft.com.cn/down/36231?module=soft.

Then add the decompressed path by: plt.rcParams["animation.ffmpeg_path"] = r"decompressed_path\ffmpeg.exe"

Upvotes: 1

user11910733
user11910733

Reputation:

I got the same error, somehow I locked the video and ffmpeg couldn't overwrite it I guess. Make sure this locked is unchecked.

enter image description here

Upvotes: 1

Related Questions