获取' av_interleaved_write_frame():管道损坏'错误

时间:2016-07-02 03:43:15

标签: python python-2.7 numpy ffmpeg video-streaming

我正在尝试这篇博文。我是python,numpy以及FFMPEG的新手。我无法弄清楚导致这个问题的原因。

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

这是代码:

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()

这是输出:

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!

1 个答案:

答案 0 :(得分:3)

这是answer建议的编程错误。由于python程序运行完毕,FFMPEG尝试在stout关闭后写入stout。一个while循环解决了这个问题。

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()