我正在尝试这篇博文。我是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!
答案 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()