美文网首页
Python 调用 FFmpeg 报错 module ‘ffmp

Python 调用 FFmpeg 报错 module ‘ffmp

作者: 牛奶大泡芙 | 来源:发表于2020-02-17 23:23 被阅读0次

在使用python中的ffmpeg-python时候遇到了几个问题,在此总结一下
1、调用 FFmpeg 报错 module ‘ffmpeg’ has no attribute ‘input’
ffmpeg原本是一个命令行工具,只是通过python封装好的API来执行,所以还是要在你本地安装ffmpeg的工具包,当时我的报错如下


bug1.png

方法:如果是mac,本地命令行中执行


method1.jpg
可能会比较慢,如果遇到依赖包安装超时,可能是网络问题,重启来一次就好。
还有一种可能就是在pip安装的时候安装了ffmpeg,实际上应该是ffmpeg-python,常见的情况就是以上这两种,terminal安装方式如下
pip3 install ffmpeg-python -i https://pypi.tuna.tsinghua.edu.cn/simple
pip3 uninstall ffmpeg

2、TypeError: img is not a numpy array, neither a scalar
使用ffmpeg输出的结果是byte类型的数据,如果用下面的方式存储成图片可能会遇到问题

cv2.imwrite("./videoframe/" + str(i) + ".jpg", cur_frame)

报错截图如下:


bug2.jpg

建议采用这种方式转化byte和图片数据,先创建图片然后注入数据:

  file = open(img_path, 'wb')
  file.write(byte_data)

3、从视频中提取视频帧的代码如下

from moviepy.editor import *
import wave
import numpy as np
import pylab
import skimage
import imageio
import cv2
import ffmpeg
import time

def extract_frame(input_path='./test.mp4'):
    """
    以60s为间隔提取视频帧,并将其作为图片保存
    :str input_path:
    :None:
    """
    vc = cv2.VideoCapture(input_path)
    c = 1
    if vc.isOpened():
        # 文件读取到结尾,rval的返回值就为False
        rval, frame = vc.read()
    else:
        rval = False
    time_interval = 60
    # 视频采样的间隔是60s,vc.get(5)获得帧频,CV_CAP_PROP_FPS
    fps = vc.get(5)
    total_frame = vc.get(7)
    loop_number = int(total_frame/(fps*60))
    timeF = fps * time_interval
    count = 0
    for i in range(loop_number):
        cur_frame = read_frame_by_time(input_path, i*60)
        cur_path = "./videoframe/" + str(i) + ".jpg"
        file = open(cur_path, 'wb')
        file.write(cur_frame)
    vc.release()


def read_frame_by_time(input_file, t):
    """
    指定时间节点读取任意帧
    """
    output_file = "./videoframe/" + str(int(t/60)) + ".jpg"
    out, err = (
        ffmpeg.input(input_file, ss=t)
            .filter('select', 'gte(n,{})'.format(250))
            .output('pipe:', vframes=1, format='image2', vcodec='mjpeg')
            .run(capture_stdout=True)
    )
    print(type(out))
    return out


if __name__ == '__main__':
    time_start = time.time()
    extract_frame()
    time_end = time.time()

相关文章

网友评论

      本文标题:Python 调用 FFmpeg 报错 module ‘ffmp

      本文链接:https://www.haomeiwen.com/subject/vmhwfhtx.html