1-Python - FFmpeg

before

FFmpeg不属于Python的包,只是Python在处理音视频的时候,可能会用到这个工具......

about

引用百度百科,FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的。

FFmpeg在Linux平台下开发,但它同样也可以在其它操作系统环境中编译运行,包括Windows、Mac OS X等。这个项目最早由Fabrice Bellard发起,2004年至2015年间由Michael Niedermayer主要负责维护。许多FFmpeg的开发人员都来自MPlayer项目,而且当前FFmpeg也是放在MPlayer项目组的服务器上。项目的名称来自MPEG视频编码标准,前面的"FF"代表"Fast Forward"。

官网:https://www.ffmpeg.org/
Github地址:https://github.com/FFmpeg/FFmpeg
百度网盘链接:https://pan.baidu.com/s/1UBcoXy6v3XG8oz0GuMKd8w 提取码:90ow

ffmpeg组成

构成FFmpeg主要有三个部分:

第一部分是四个作用不同的工具软件,分别是:ffmpeg.exe,ffplay.exe,ffserver.exe和ffprobe.exe。

  • ffmpeg.exe:音视频转码、转换器
  • ffplay.exe:简单的音视频播放器
  • ffserver.exe:流媒体服务器
  • ffprobe.exe:简单的多媒体码流分析器

第二部分是可以供开发者使用的SDK,为各个不同平台编译完成的库。如果说上面的四个工具软件都是完整成品形式的玩具,那么这些库就相当于乐高积木一样,我们可以根据自己的需求使用这些库开发自己的应用程序。这些库有:

  • libavcodec:包含音视频编码器和解码器
  • libavutil:包含多媒体应用常用的简化编程的工具,如随机数生成器、数据结构、数学函数等功能
  • libavformat:包含多种多媒体容器格式的封装、解封装工具
  • libavfilter:包含多媒体处理常用的滤镜功能
  • libavdevice:用于音视频数据采集和渲染等功能的设备相关
  • libswscale:用于图像缩放和色彩空间和像素格式转换功能
  • libswresample:用于音频重采样和格式转换等功能

第三部分是整个工程的源代码,无论是编译出来的可执行程序还是SDK,都是由这些源代码编译出来的。FFmpeg的源代码由C语言实现,主要在Linux平台上进行开发。FFmpeg不是一个孤立的工程,它还存在多个依赖的第三方工程来增强它自身的功能。在当前这一系列的博文/视频中,我们暂时不会涉及太多源代码相关的内容,主要以FFmpeg的工具和SDK的调用为主。到下一系列我们将专门研究如何编译源代码并根据源代码来进行二次开发。

FFmpeg for Windows

下载

打开官网下载地址:http://ffmpeg.org/download.html

在下载页面上,我们可以看到,对于32位和64位版本,分别提供了三种不同的模式:static、shared和dev:

  • static: 该版本提供了静态版本的FFmpeg工具,将依赖的库生成在了最终的可执行文件中;作为工具而言此版本就可以满足我们的需求;
  • share: 该版本的工具包括可执行文件和dll,程序运行过程必须依赖于提供的dll文件;
  • dev: 提供了库的头文件和dll的引导库;

这里我选择static版本的。

完事点击下载即可。

安装

将下载到本地的压缩包解压到合适的位置。

比如我将它解压到G:\software目录。

配置环境变量

复制软件的bin目录路径G:\software\ffmpeg-4.2.1-win64-static\bin,将它添加到系统环境变量的Path中:

测试

终端执行ffmpeg -version命令查看是否安装成功:

PS:可能有的电脑重启才能生效....

OK,安装成功。

usage

先说我之前遇到的问题,我使用OpenCV(4.1.1.26版本)录制屏幕,然后保存为MP4视频,最开始是保存AVI的,谁知道,这两种在前端video标签都无法正常播放。

后来,才知道MP4并不是简单地.mp4就是我们看到的MP4了。有别的视频编码格式不对,浏览器仍然无法识别。

经过分析,浏览器支持的video标签识别h264编码的MP4视频。我才有了查询我用OpenCV录制的视频格式的想法。这不是就用到了FFmpeg这个好用的东东。

查看编码

ffmpeg -i test.mp4

示例:

C:\Users\Anthony>ffmpeg -i M:\demo\AT2\more\test.mp4
Stream #0:0(und): Video: mpeg4 (Simple Profile) (mp4v / 0x7634706D)

省略了其他部分,重点看Video: mpeg4,没错,我用OpenCV录制的是mpeg4格式的MP4视频。虽然本地能播放,但浏览器却不能播放,反正我的谷歌和火狐浏览器都不能播放,但用别的电脑却可以,这个结果让我一度认为我的视频没问题......有大神知道怎么回事的,欢迎指正。

在看个我的浏览器能播放的:

C:\Users\Anthony>ffmpeg -i M:\demo\AT2\more\b.mp4
Stream #0:0(und): Video: h264 (Constrained Baseline) (avc1 / 

没错,h264格式!

不纠结其中的原因,只思考解决办法,我只要把mpeg4格式的转换为h264格式的不就完了嘛,是的,我也是这么干的。

视频编码转换

是的,将编码方式是mpeg4格式的MP4视频转换为h264格式的MP4视频。

mpeg4转h264

终端执行:

ffmpeg -i input.mp4 -vcodec h264 output.mp4  //input.mp4是指要转换视频的地址;output.mp4是转化后视频的存放路径

h264转mpeg4

ffmpeg -i input.mp4 -vcodec mpeg4 output.mp4

问题

上面的问题,终端使用就没问题,但是,全部使用Python代码来解决还是会出现一些问题。

就是在使用Python执行终端命令时,出现问题。

问题1

使用下面命令时会提示,ffmpeg不是可执行的命令,意思是说,Python没有找到ffmpeg可执行文件,也可能是我下面代码写的有问题。

subprocess.Popen('ffmpeg -i {} -vcode h264 {}'.format('./test.mp4', './test1.mp4'), shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

解决办法:

  • 法1,将ffmpeg.exe文件拷贝与脚本文件同级目录即可。
  • 法2,拿到ffmpeg.exe文件的绝对路径也一样。

我选择法2,但是依然转码失败。

后来,我下载了一个Python相关库:

pip install ffmpy3
pip install ffmpy3==3-0.2.3

使用ffmp3解决问题:

import ffmpy3
ffmpy3.FFmpeg(inputs={'./test.mp4': None}, outputs={'test1.mp4':None}).run()

关于ffmp3的其他用法,参考:https://ffmpy3.readthedocs.io/en/latest/index.html

当然,此时的ffmpeg.exe可执行文件仍然在脚本的同级目录,不然依然报错:

ffmpy3.FFExecutableNotFoundError: Executable 'ffmpeg' not found

完整示例:

import cv2
import numpy as np
from PIL import ImageGrab
from threading import Thread
import ffmpy3

a = False


def f1():
    ffmpy3.FFmpeg(inputs={'./test.mp4': None}, outputs={'test1.mp4': None}).run()


def f2():
    p = ImageGrab.grab()
    width, height = p.size
    fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')

    video = cv2.VideoWriter('./test.mp4', fourcc, 8, (width, height), True)
    while 1:
        img = ImageGrab.grab()
        img_bgr = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR)
        video.write(img_bgr)
        if a:
            break
    video.release()
    f1()

def f3():
    global a
    import time
    time.sleep(3)
    a = True


if __name__ == '__main__':
    Thread(target=f3).start()
    f2()

欢迎斧正,that's all see also:

mp4格式的视频,编码方式mpeg4,转化为h264 | Ffmpeg常用转码命令 | FFmpeg安装(windows环境) | Python-OpenCV录制H264编码的MP4视频 | H264 encoding failure | video不能播放mp4的问题(一) | HTML video 标签 | FFmpeg Builds | ffmpy3 | python ffmpy3与FFmpeg的安装 | python 使用 ffmpeg |

posted @ 2019-10-15 15:00  听雨危楼  阅读(36066)  评论(2编辑  收藏  举报