在 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

使用Python3OpenCV 3+ 完成

【讨论】:

根据他在问题中的 cmets,OP 对 OpenCV 有问题

以上是关于在 Python 中提取视频帧的主要内容,如果未能解决你的问题,请参考以下文章

python 从视频中提取帧范围

python 视频处理,提取视频相关帧,读取Excel

Python:使用PyAV提取视频关键帧

python tools:将视频的每一帧提取并保存

python tools:将视频的每一帧提取并保存

ffmpeg-python 任意提取视频帧