Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Getting 'av_interleaved_write_frame(): Broken pipe' error

I am trying this blog post.I am new to python, numpy as well as FFMPEG. I could not figure out what causes this issue.

http://zulko.github.io/blog/2013/09/27/read-and-write-video-frames-in-python-using-ffmpeg/

here is the code:

import subprocess as sp
import numpy

print ("Hello World!");
FFMPEG_BIN = "ffmpeg" # on Linux ans Mac OS
#FFMPEG_BIN = "ffmpeg.exe" # on Windows

command = [ FFMPEG_BIN,
            '-i', '/Users/eananthaneshan/Movies/myvideo.mp4',
            '-f', 'image2pipe',
            '-pix_fmt', 'yuv444p',
            '-s', '420x360',
            '-r', '24',
            '-vcodec', 'h264', '-']
pipe = sp.Popen(command, stdout = sp.PIPE, bufsize=-1)

# read 420*360*3 bytes (= 1 frame)
raw_image = pipe.stdout.read(420*360*3)
# transform the byte read into a numpy array
image =  numpy.fromstring(raw_image, dtype='uint8')
image = image.reshape((360,420,3)   )
# throw away the data in the pipe's buffer.
pipe.stdout.flush()

This is the output:

ffmpeg version 2.8 Copyright (c) 2000-2015 the FFmpeg developers
  built with Apple LLVM version 7.0.0 (clang-700.0.72)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/2.8 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-opencl --enable-libx264 --enable-libmp3lame --enable-libvo-aacenc --enable-libxvid --enable-libfreetype --enable-libtheora --enable-libvorbis --enable-libvpx --enable-librtmp --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libass --enable-ffplay --enable-libspeex --enable-libschroedinger --enable-libfdk-aac --enable-libopus --enable-frei0r --enable-libopenjpeg --disable-decoder=jpeg2000 --extra-cflags='-I/usr/local/Cellar/openjpeg/1.5.2_1/include/openjpeg-1.5 ' --enable-nonfree --enable-vda
  libavutil      54. 31.100 / 54. 31.100
  libavcodec     56. 60.100 / 56. 60.100
  libavformat    56. 40.101 / 56. 40.101
  libavdevice    56.  4.100 / 56.  4.100
  libavfilter     5. 40.101 /  5. 40.101
  libavresample   2.  1.  0 /  2.  1.  0
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  2.101 /  1.  2.101
  libpostproc    53.  3.100 / 53.  3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/Users/eananthaneshan/Movies/myvideo.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 1
    compatible_brands: isom
    creation_time   : 2014-04-07 02:02:31
  Duration: 01:00:10.03, start: 0.000000, bitrate: 1024 kb/s
    Stream #0:0(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 111 kb/s (default)
    Metadata:
      creation_time   : 2014-04-07 02:02:31
      handler_name    : GPAC ISO Audio Handler
    Stream #0:1(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709/unknown/unknown), 720x404, 909 kb/s, 23.98 fps, 23.98 tbr, 24k tbn, 47.95 tbc (default)
    Metadata:
      creation_time   : 2014-04-07 01:14:58
      handler_name    : L-SMASH Video Media Handler
      encoder         : AVC Coding
Output #0, image2pipe, to 'pipe:':
  Metadata:
    major_brand     : isom
    minor_version   : 1
    compatible_brands: isom
    encoder         : Lavf56.40.101
    Stream #0:0(und): Video: rawvideo (444P / 0x50343434), yuv444p, 420x360, q=2-31, 200 kb/s, 23.98 fps, 23.98 tbn, 23.98 tbc (default)
    Metadata:
      creation_time   : 2014-04-07 01:14:58
      handler_name    : L-SMASH Video Media Handler
      encoder         : Lavc56.60.100 rawvideo
Stream mapping:
  Stream #0:1 -> #0:0 (h264 (native) -> rawvideo (native))
Press [q] to stop, [?] for help
av_interleaved_write_frame(): Broken pipe
frame=    2 fps=0.0 q=-0.0 Lsize=     886kB time=00:00:00.08 bitrate=87003.8kbits/s    
video:886kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.000000%
Conversion failed!
like image 589
Poornan Avatar asked Jul 02 '16 03:07

Poornan


People also ask

What causes broken pipe error Python?

Broken Pipe Error in Python terminal But when the downstream process will not be able to read the data upstream, it will raise an exception by sending SIGPIPE signal to the upstream process. Thus upstream process in a python problem will raise an error such as IOError: Broken pipe error will occur.


1 Answers

It is a programming error as this answer suggests. FFMPEG tries to write to stout after stout is closed because python program finished running. a while loop solved this problem.

while true:
#for line in pipe.stdout:
# read 420*360*3 bytes (= 1 frame)
    raw_image = pipe.stdout.read(420*360*3)
# transform the byte read into a numpy array
    image =  numpy.fromstring(raw_image, dtype='uint8')
    image = image.reshape((360,420,3))
#    pylab.imshow(image)
#plt.savefig('foo.png')
# throw away the data in the pipe's buffer.
    pipe.stdout.flush()
like image 117
Poornan Avatar answered Oct 23 '22 04:10

Poornan