2016-07-02 10 views
1

Ich versuche diesen Blog-Post.Ich bin neu zu Python, Numpy sowie FFMPEG. Ich konnte nicht herausfinden, was dieses Problem verursacht.Getting 'av_interleaved_write_frame(): Broken pipe' Fehler

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

hier ist der 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() 

Dies ist die Ausgabe:

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! 
+0

https://github.com/fluent-ffmpeg/node-fluent-ffmpeg/issues/470 und http://stackoverflow.com/questions/36420233/ffmpeg-av-interleaved-write-frame- broken-pipe-under-windows können verwandt sein - einige os spezifische Probleme. – dmitryro

+0

http://forum.odroid.com/viewtopic.php?f=112&t=8816 – dmitryro

+0

Vielen Dank @dmitryro. Leider gibt mir keiner davon den Anschein, dass dies funktioniert. – Poornan

Antwort

1

Es ist ein Programmierfehler, da dies answer vermuten lässt. FFMPEG versucht zu schreiben, nachdem Stout geschlossen wurde, weil das Python-Programm beendet wurde. Eine while-Schleife löste dieses 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()