在 Python 中提取视频帧
Posted
技术标签:
【中文标题】在 Python 中提取视频帧【英文标题】:Extract Video Frames In Python 【发布时间】:2012-05-27 04:55:56 【问题描述】:我想提取视频帧并将它们保存为图像。
import os, sys
from PIL import Image
a, b, c = os.popen3("ffmpeg -i test.avi")
out = c.read()
dp = out.index("Duration: ")
duration = out[dp+10:dp+out[dp:].index(",")]
hh, mm, ss = map(float, duration.split(":"))
total = (hh*60 + mm)*60 + ss
for i in xrange(9):
t = (i + 1) * total / 10
os.system("ffmpeg -i test.avi -ss %0.3fs frame%i.png" % (t, i))
但我有这个错误:
FFmpeg version CVS, Copyright (c) 2000-2004 Fabrice Bellard
Mac OSX universal build for ffmpegX
configuration: --enable-memalign-hack --enable-mp3lame --enable-gpl --disable-vhook --disable-ffplay --disable-ffserver --enable-a52 --enable-xvid --enable-faac --enable-faad --enable-amr_nb --enable-amr_wb --enable-pthreads --enable-x264
libavutil version: 49.0.0
libavcodec version: 51.9.0
libavformat version: 50.4.0
built on Apr 15 2006 04:58:19, gcc: 4.0.1 (Apple Computer, Inc. build 5250)
Input #0, avi, from 'test.avi':
Duration: 00:00:30.5, start: 0.000000, bitrate: 465 kb/s
Stream #0.0, 25.00 fps(r): Video: mpeg4, yuv420p, 640x480
Stream #0.1: Audio: mp3, 32000 Hz, mono, 32 kb/s
Unable for find a suitable output format for 'frame0.png'
编辑:ffmpeg -格式
FFmpeg version CVS, Copyright (c) 2000-2004 Fabrice Bellard
Mac OSX universal build for ffmpegX
configuration: --enable-memalign-hack --enable-mp3lame --enable-gpl --disable-vhook --disable-ffplay --disable-ffserver --enable-a52 --enable-xvid --enable-faac --enable-faad --enable-amr_nb --enable-amr_wb --enable-pthreads --enable-x264
libavutil version: 49.0.0
libavcodec version: 51.9.0
libavformat version: 50.4.0
built on Apr 15 2006 04:58:19, gcc: 4.0.1 (Apple Computer, Inc. build 5250)
File formats:
E 3g2 3gp2 format
E 3gp 3gp format
D 4xm 4X Technologies format
D RoQ Id RoQ format
D aac ADTS AAC
DE ac3 raw ac3
E adts ADTS AAC
DE aiff Audio IFF
DE alaw pcm A law format
DE amr 3gpp amr file format
DE asf asf format
E asf_stream asf format
DE au SUN AU Format
DE avi avi format
D avs avs format
E crc crc testing format
D daud D-Cinema audio format
D dts raw dts
DE dv DV video format
E dvd MPEG2 PS format (DVD VOB)
D ea Electronic Arts Multimedia Format
DE ffm ffm format
D film_cpk Sega FILM/CPK format
D flic FLI/FLC/FLX animation format
DE flv flv format
E framecrc framecrc testing format
DE gif GIF Animation
DE h261 raw h261
DE h263 raw h263
DE h264 raw H264 video format
D idcin Id CIN format
DE image image sequence
DE image2 image2 sequence
DE image2pipe piped image2 sequence
DE imagepipe piped image sequence
D ingenient Ingenient MJPEG
D ipmovie Interplay MVE format
DE m4v raw MPEG4 video format
D matroska Matroska file format
DE mjpeg MJPEG video
D mm American Laser Games MM format
DE mmf mmf format
E mov mov format
D mov,mp4,m4a,3gp,3g2,mj2 QuickTime/MPEG4/Motion JPEG 2000 format
E mp2 MPEG audio layer 2
DE mp3 MPEG audio layer 3
E mp4 mp4 format
DE mpeg MPEG1 System format
E mpeg1video MPEG video
E mpeg2video MPEG2 video
DE mpegts MPEG2 transport stream format
D mpegvideo MPEG video
E mpjpeg Mime multipart JPEG format
DE mulaw pcm mu law format
D nsv NullSoft Video format
E null null video format
DE nut nut format
D nuv NuppelVideo format
D ogg Ogg
E psp psp mp4 format
D psxstr Sony Playstation STR format
DE rawvideo raw video format
D redir Redirector format
DE rm rm format
E rtp RTP output format
D rtsp RTSP input format
DE s16be pcm signed 16 bit big endian format
DE s16le pcm signed 16 bit little endian format
DE s8 pcm signed 8 bit format
D sdp SDP
D shn raw shorten
D smk Smacker Video
D sol Sierra SOL Format
E svcd MPEG2 PS format (VOB)
DE swf Flash format
D tta true-audio
DE u16be pcm unsigned 16 bit big endian format
DE u16le pcm unsigned 16 bit little endian format
DE u8 pcm unsigned 8 bit format
E vcd MPEG1 System format (VCD)
D vmd Sierra VMD format
E vob MPEG2 PS format (VOB)
DE voc Creative Voice File format
DE wav wav format
D wc3movie Wing Commander III movie format
D wsaud Westwood Studios audio format
D wsvqa Westwood Studios VQA format
DE yuv4mpegpipe YUV4MPEG pipe format
Image formats (filename extensions, if any, follow):
DE gif gif
Codecs:
D V 4xm
D V D 8bps
DEA aac
D V D aasc
DEA ac3
DEA adpcm_4xm
DEA adpcm_adx
DEA adpcm_ct
DEA adpcm_ea
DEA adpcm_ima_dk3
DEA adpcm_ima_dk4
DEA adpcm_ima_qt
DEA adpcm_ima_smjpeg
DEA adpcm_ima_wav
DEA adpcm_ima_ws
DEA adpcm_ms
DEA adpcm_sbpro_2
DEA adpcm_sbpro_3
DEA adpcm_sbpro_4
DEA adpcm_swf
DEA adpcm_xa
DEA adpcm_yamaha
D A alac
DEA amr_nb
DEA amr_wb
DEV D asv1
DEV D asv2
D V D avs
D V bmp
D V D camstudio
D V D camtasia
D V D cinepak
D V D cljr
D A cook
D V D cyuv
DES dvbsub
DES dvdsub
DEV D dvvideo
DEV D ffv1
DEVSD ffvhuff
D A flac
D V D flic
DEVSD flv
D V D fraps
DEA g726
DEV D h261
DEVSDT h263
D VSD h263i
EV h263p
DEV DT h264
DEVSD huffyuv
D V D idcinvideo
D V D indeo2
D V indeo3
D A interplay_dpcm
D V D interplayvideo
EV jpegls
D V kmvc
EV ljpeg
D V D loco
D A mace3
D A mace6
D V D mdec
DEV D mjpeg
D V D mjpegb
D V D mmvideo
DEA mp2
DEA mp3
D A mp3adu
D A mp3on4
DEVSDT mpeg1video
DEVSDT mpeg2video
DEVSDT mpeg4
D A mpeg4aac
D VSDT mpegvideo
DEVSD msmpeg4
DEVSD msmpeg4v1
DEVSD msmpeg4v2
D V D msrle
D V D msvideo1
D V D mszh
D V D nuv
DEV pam
DEV pbm
DEA pcm_alaw
DEA pcm_mulaw
DEA pcm_s16be
DEA pcm_s16le
DEA pcm_s24be
DEA pcm_s24daud
DEA pcm_s24le
DEA pcm_s32be
DEA pcm_s32le
DEA pcm_s8
DEA pcm_u16be
DEA pcm_u16le
DEA pcm_u24be
DEA pcm_u24le
DEA pcm_u32be
DEA pcm_u32le
DEA pcm_u8
DEV pgm
DEV pgmyuv
DEV png
DEV ppm
D A qdm2
D V D qdraw
D V D qpeg
D V D qtrle
DEV rawvideo
D A real_144
D A real_288
D A roq_dpcm
D V D roqvideo
D V D rpza
DEV D rv10
DEV D rv20
D A shorten
D A smackaud
D V smackvid
D V D smc
DEV snow
D A sol_dpcm
DEA sonic
EA sonicls
D V D sp5x
DEV D svq1
D VSD svq3
D V theora
D V D truemotion1
D V D truemotion2
D A truespeech
D A tta
D V D ultimotion
D V vc9
D V D vcr1
D A vmdaudio
D V D vmdvideo
D A vorbis
D V vp3
D V D vqavideo
D A wmav1
D A wmav2
DEVSD wmv1
DEVSD wmv2
D V D wnv1
D A ws_snd1
D A xan_dpcm
D V D xan_wc3
D V D xl
EV xvid
DEV D zlib
D V zmbv
Supported file protocols:
file: pipe: udp: rtp: tcp: http:
Frame size, frame rate abbreviations:
ntsc pal qntsc qpal sntsc spal film ntsc-film sqcif qcif cif 4cif
Motion estimation methods:
zero(fastest) full(slowest) log phods epzs(default) x1 hex umh iter
Note, the names of encoders and decoders dont always match, so there are
several cases where the above table shows encoder only or decoder only entries
even though both encoding and decoding are supported for example, the h263
decoder corresponds to the h263 and h263p encoders, for file formats its even
worse
我的代码有什么问题?提前致谢
【问题讨论】:
您可以尝试使用 OpenCV 库进行任何图像视频操作,opencv.willowgarage.com/documentation/python/… 你为什么用os.system()
而不是subprocess.call()
?
运行 ffmpeg -formats
以查看您可以使用哪些格式
我可以从终端使用 ffmpeg -itsoffset -4 -i test.avi -vcodec mjpeg -vframes 1 -an -f rawvideo -s 320x240 test.jpg 来做到这一点,但不能来自 python
@SeçkinSavaşçı,opencv 无法在 mac 上安装:***.com/questions/10675298/…,我必须使用其他库。 teşekkürler
【参考方案1】:
ffmpeg 抱怨文件名中缺少%d
,因为您已要求它转换多个帧。
This post 建议这是使用 ffmpeg 提取单帧的更好方法
ffmpeg -i n.wmv -ss 00:00:20 -t 00:00:1 -s 320×240 -r 1 -f singlejpeg myframe.jpg
[编辑]
在more research 之后,这是一个输出单个 png 帧的命令行
ffmpeg -i test.avi -vcodec png -ss 10 -vframes 1 -an -f rawvideo test.png
在我的 ubuntu 12.04 笔记本电脑上测试
【讨论】:
+1 但这只是一种解决方法。问题指向 png 文件 我已经解决了 'os.system("ffmpeg -i test.avi -r 0.08 -f image2 -s 128x96 %4d.png")' 链接已损坏。 能否解释一下各个开关和参数的作用?我当然会学到很多,但像其他人一样,当我能得到它时,可以使用它。我说的是这个命令 ffmpeg -i test.avi -vcodec png -ss 10 -vframes 1 -an -f rawvideo test.png' 如果将-ss 10
参数移到 -i test.avi
参数之前,效率会大大提高。这样,ffmpeg 不会将整个视频解码到内存中以提取单个帧。可能快一百倍。【参考方案2】:
您的 ffmpeg 不支持 png 文件格式。您应该改用 jpg 或 gif。也请关注此post(由“昨天”首次发布)。
【讨论】:
【参考方案3】:简单的方法,使用 Open CV。
import cv2
vc = cv2.VideoCapture('Test.mp4')
c=1
if vc.isOpened():
rval , frame = vc.read()
else:
rval = False
while rval:
rval, frame = vc.read()
cv2.imwrite(str(c) + '.jpg',frame)
c = c + 1
cv2.waitKey(1)
vc.release()
【讨论】:
这对我不起作用;它不输出任何内容,但不报告任何错误。 @GShocked:你在 Ubuntu 上尝试吗?这不适用于 Ubuntu。试试moviepy @Megha 我使用的是 Windows,但我不再需要它。不敢相信我在 5 年前问过这个问题【参考方案4】:有 ffmpeg python 模块可用
ffmpeg:https://code.google.com/p/pyffmpeg/
pyAV:https://github.com/mikeboers/PyAV
import av
container = av.open('/path/to/video.mp4')
for packet in container.demux():
for frame in packet.decode():
if frame.type == 'video':
frame.to_image().save('/path/to/frame-%04d.jpg' % frame.index)
【讨论】:
这对我很有效,谢谢。实际上,我必须安装 Pillow 包才能让 av 正常工作(代替 PIL),因为自从你写了这个之后 av 模块发生了变化,但是在那之后你的 sn-p 工作得很好。荣誉。【参考方案5】:import numpy as np
import cv2
capture = cv2.VideoCapture(0)
size = (int(capture.get(3)),int(capture.get(4)))
fourcc = cv2.VideoWriter_fourcc(*'XVID')
video = cv2.VideoWriter('output.avi',fourcc,30,size)
print capture.isOpened()
num=0
while True:
ret, img = capture.read()
video.write(img)
cv2.imshow('video',img)
cv2.imwrite("image" + str(num) + ".jpg",img)
num = num + 1
key= cv2.waitKey(1)
if key == ord('q')
num=0
break
video.release()
capture.release()
cv2.destroyAllWindows()
【讨论】:
【参考方案6】:有更简单的方法可以做到这一点。只需使用OpenCV
并获得所需的所有框架。
请参考这里的答案:How to extract frames from Videos
使用Python3
和OpenCV 3+
完成
【讨论】:
根据他在问题中的 cmets,OP 对OpenCV
有问题以上是关于在 Python 中提取视频帧的主要内容,如果未能解决你的问题,请参考以下文章