pyffmpeg
我在 Ubuntu 上安装失败。
Cython
安装似乎是正确的:
$ sudo python setup.py install
...
Adding Cython 0.22.1 to easy-install.pth file
Installing cython script to /usr/local/bin
Installing cygdb script to /usr/local/bin
Installing cythonize script to /usr/local/bin
Installed /usr/local/lib/python2.7/dist-packages/Cython-0.22.1-py2.7-linux-x86_64.egg
Processing dependencies for Cython==0.22.1
Finished processing dependencies for Cython==0.22.1
我的ffmpeg
地址是:
/usr/bin/ffmpeg
因此,我相应地更改setup.py
了pyffmpeg
。
但是,尝试安装pyffmpeg
会产生这些 Cython 错误:
$ sudo python setup.py install
[sudo] password for openstack:
Remember: Edit at first ffmpegpath within setup.py
running install
running build
running build_ext
cythoning pyffmpeg.pyx to pyffmpeg.c
warning: pyffmpeg.pyx:4295:52: Unreachable code
Error compiling Cython file:
------------------------------------------------------------
...
cdef AFFMpegReader vr
cdef int no
## cdef AVFormatContext *FormatCtx
cdef AVCodecContext *CodecCtx
cdef AVCodec *Codec
cdef AVOptions *codec_options
^
------------------------------------------------------------
pyffmpeg.pyx:3118:9: 'AVOptions' is not a type identifier
Error compiling Cython file:
------------------------------------------------------------
...
self.CodecCtx.skip_loop_filter = AVDISCARD_NONKEY
self.CodecCtx.skip_frame = AVDISCARD_NONKEY
self.CodecCtx.skip_idct = AVDISCARD_NONKEY
# deprecated
# 1-> Skip B-frames, 2-> Skip IDCT/dequant too, 5-> Skip everything except header
self.CodecCtx.hurry_up=2
^
------------------------------------------------------------
pyffmpeg.pyx:3210:25: Object of type 'AVCodecContext' has no attribute 'hurry_up'
Error compiling Cython file:
------------------------------------------------------------
...
self.Codec = avcodec_find_decoder(self.CodecCtx.codec_id)
if self.Codec == NULL:
raise IOError("Unable to get decoder")
if (self.Codec.capabilities & CODEC_CAP_TRUNCATED) and (self.support_truncated!=0):
self.CodecCtx.flags = self.CodecCtx.flags | CODEC_FLAG_TRUNCATED
ret = avcodec_open(self.CodecCtx, self.Codec)
^
------------------------------------------------------------
pyffmpeg.pyx:3303:31: Cannot convert 'AVCodecContext *' to Python object
Error compiling Cython file:
------------------------------------------------------------
...
self.Codec = avcodec_find_decoder(self.CodecCtx.codec_id)
if self.Codec == NULL:
raise IOError("Unable to get decoder")
if (self.Codec.capabilities & CODEC_CAP_TRUNCATED) and (self.support_truncated!=0):
self.CodecCtx.flags = self.CodecCtx.flags | CODEC_FLAG_TRUNCATED
ret = avcodec_open(self.CodecCtx, self.Codec)
^
------------------------------------------------------------
pyffmpeg.pyx:3303:46: Cannot convert 'AVCodec *' to Python object
Error compiling Cython file:
------------------------------------------------------------
...
def set_hurry(self, b=1):
#if we hurry it we can get bad frames later in the GOP
if (b) :
self.CodecCtx.skip_idct = AVDISCARD_BIDIR
self.CodecCtx.skip_frame = AVDISCARD_BIDIR
self.CodecCtx.hurry_up = 1
^
------------------------------------------------------------
pyffmpeg.pyx:4034:25: Object of type 'AVCodecContext' has no attribute 'hurry_up'
Error compiling Cython file:
------------------------------------------------------------
...
self.CodecCtx.hurry_up = 1
self.hurried_frames = 0
else:
self.CodecCtx.skip_idct = AVDISCARD_DEFAULT
self.CodecCtx.skip_frame = AVDISCARD_DEFAULT
self.CodecCtx.hurry_up = 0
^
------------------------------------------------------------
pyffmpeg.pyx:4039:25: Object of type 'AVCodecContext' has no attribute 'hurry_up'
Error compiling Cython file:
------------------------------------------------------------
...
# time related functions
# #########################################################
def get_fps(self):
""" return the number of frame per second of the video """
return (<float>self.stream.r_frame_rate.num / <float>self.stream.r_frame_rate.den)
^
------------------------------------------------------------
pyffmpeg.pyx:4104:34: Object of type 'AVStream' has no attribute 'r_frame_rate'
Error compiling Cython file:
------------------------------------------------------------
...
# time related functions
# #########################################################
def get_fps(self):
""" return the number of frame per second of the video """
return (<float>self.stream.r_frame_rate.num / <float>self.stream.r_frame_rate.den)
^
------------------------------------------------------------
pyffmpeg.pyx:4104:72: Object of type 'AVStream' has no attribute 'r_frame_rate'
Error compiling Cython file:
------------------------------------------------------------
...
av_free_packet(self.packet)
self.packet=NULL
if (self.prepacket):
av_free_packet(self.prepacket)
self.prepacket=NULL
av_close_input_file(self.FormatCtx)
^
------------------------------------------------------------
pyffmpeg.pyx:4252:36: Cannot convert 'AVFormatContext *' to Python object
Error compiling Cython file:
------------------------------------------------------------
...
if (fmt==NULL) or (not (fmt.flags & AVFMT_NOFILE)):
ret = avio_open(&self.FormatCtx.pb, filename, 0)
if ret < 0:
raise IOError("Unable to open file %s (avio_open)" % filename)
if (buf_size>0):
url_setbufsize(self.FormatCtx.pb,buf_size)
^
------------------------------------------------------------
pyffmpeg.pyx:4307:45: Cannot convert 'AVIOContext *' to Python object
Error compiling Cython file:
------------------------------------------------------------
...
assert(fmt!=NULL)
self.FormatCtx.iformat=fmt
if (mode=="r"):
ret = av_open_input_stream(&self.FormatCtx,self.FormatCtx.pb,filename,self.FormatCtx.iformat,NULL)
^
------------------------------------------------------------
pyffmpeg.pyx:4328:39: Cannot convert 'AVFormatContext **' to Python object
Error compiling Cython file:
------------------------------------------------------------
...
assert(fmt!=NULL)
self.FormatCtx.iformat=fmt
if (mode=="r"):
ret = av_open_input_stream(&self.FormatCtx,self.FormatCtx.pb,filename,self.FormatCtx.iformat,NULL)
^
------------------------------------------------------------
pyffmpeg.pyx:4328:69: Cannot convert 'AVIOContext *' to Python object
Error compiling Cython file:
------------------------------------------------------------
...
assert(fmt!=NULL)
self.FormatCtx.iformat=fmt
if (mode=="r"):
ret = av_open_input_stream(&self.FormatCtx,self.FormatCtx.pb,filename,self.FormatCtx.iformat,NULL)
^
------------------------------------------------------------
pyffmpeg.pyx:4328:96: Cannot convert 'AVInputFormat *' to Python object
Error compiling Cython file:
------------------------------------------------------------
...
assert(fmt!=NULL)
self.FormatCtx.iformat=fmt
if (mode=="r"):
ret = av_open_input_stream(&self.FormatCtx,self.FormatCtx.pb,filename,self.FormatCtx.iformat,NULL)
^
------------------------------------------------------------
pyffmpeg.pyx:4328:105: Cannot convert 'void *' to Python object
warning: pyffmpeg.pyx:4348:52: Obtaining 'char *' from externally modifiable global Python value
Error compiling Cython file:
------------------------------------------------------------
...
# Guess file format with file extention
oc.oformat = av_guess_format(NULL, filename_, NULL)
if (oc.oformat==NULL):
raise Exception, "Unable to find output format for %s\n"
# Alloc priv_data for format
oc.priv_data = av_mallocz(oc.oformat.priv_data_size)
^
------------------------------------------------------------
pyffmpeg.pyx:4352:44: Object of type 'AVOutputFormat' has no attribute 'priv_data_size'
warning: pyffmpeg.pyx:4369:35: Obtaining 'char *' from externally modifiable global Python value
Error compiling Cython file:
------------------------------------------------------------
...
cdef int ret
cdef int i
if (track_selector==None):
track_selector=TS_VIDEO
ret = av_find_stream_info(self.FormatCtx)
^
------------------------------------------------------------
pyffmpeg.pyx:4385:38: Cannot convert 'AVFormatContext *' to Python object
Error compiling Cython file:
------------------------------------------------------------
...
self.packet=NULL
if (self.prepacket):
av_free_packet(self.prepacket)
self.prepacket=NULL
self.tracks=[] # break cross references
av_close_input_file(self.FormatCtx)
^
------------------------------------------------------------
pyffmpeg.pyx:4478:36: Cannot convert 'AVFormatContext *' to Python object
Error compiling Cython file:
------------------------------------------------------------
...
if (ct.no==self.packet.stream_index):
#ct.process_packet(self.packet)
## I don't know why it seems that Windows Cython have problem calling the correct virtual function
##
##
if ct.CodecCtx.codec_type==CODEC_TYPE_VIDEO:
^
------------------------------------------------------------
pyffmpeg.pyx:4560:41: Invalid types for '==' (AVMediaType, CodecType)
Error compiling Cython file:
------------------------------------------------------------
...
##
if ct.CodecCtx.codec_type==CODEC_TYPE_VIDEO:
processed=True
vt=ct
vt.process_packet(self.packet)
elif ct.CodecCtx.codec_type==CODEC_TYPE_AUDIO:
^
------------------------------------------------------------
pyffmpeg.pyx:4564:43: Invalid types for '==' (AVMediaType, CodecType)
Error compiling Cython file:
------------------------------------------------------------
...
ret = av_seek_frame(self.FormatCtx,-1,byte, AVSEEK_FLAG_BACKWARD|AVSEEK_FLAG_BYTE)#|AVSEEK_FLAG_ANY)
if ret < 0:
raise IOError("Unable to seek: %d" % (ret,))
if (self.io_context!=NULL):
# used to have & here
avio_seek(self.FormatCtx.pb, self.FormatCtx.data_offset, SEEK_SET)
^
------------------------------------------------------------
pyffmpeg.pyx:4738:55: Object of type 'AVFormatContext' has no attribute 'data_offset'
building 'pyffmpeg' extension
C compiler: x86_64-linux-gnu-gcc -pthread -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fno-strict-aliasing -D_FORTIFY_SOURCE=2 -g -fstack-protector-strong -Wformat -Werror=format-security -fPIC
compile options: '-I/usr/bin/ffmpeg/include -I/usr/include -I./include -I/usr/local/lib/python2.7/dist-packages/numpy/core/include -I/usr/include/python2.7 -c'
x86_64-linux-gnu-gcc: pyffmpeg.c
cc1: error: /usr/bin/ffmpeg/include: Not a directory
cc1: error: /usr/bin/ffmpeg/include: Not a directory
error: Command "x86_64-linux-gnu-gcc -pthread -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fno-strict-aliasing -D_FORTIFY_SOURCE=2 -g -fstack-protector-strong -Wformat -Werror=format-security -fPIC -I/usr/bin/ffmpeg/include -I/usr/include -I./include -I/usr/local/lib/python2.7/dist-packages/numpy/core/include -I/usr/include/python2.7 -c pyffmpeg.c -o build/temp.linux-x86_64-2.7/pyffmpeg.o" failed with exit status 1
我需要改变什么才能安装pyffmpeg
?
答案1
ffmpeg 所要求的路径是库文件路径,而不是二进制文件路径。在这方面应该更清楚一点,但它显示“不是目录”这一事实有助于解决该特定错误。
而且,与 ffmpeg 库相比,这似乎已经过时了,并且可能无法与比 README 中提到的版本更新的版本一起使用。