在python中优雅的使用ffmpeg:PyAV

29 篇文章 0 订阅
6 篇文章 0 订阅

ffmpeg是强大的多媒体处理工具,堪称多媒体处理的瑞士军刀,涵盖了大量的多媒体处理工具。但是ffmpeg是由纯C语言写成,对于python用户来说使用难度较高,为此今天向大家推荐一款在python中使用ffmpeg的开发包:PyAV

PyAV提供了ffmpeg的python接口,但实际是它只是使用ffmpeg做后端,使用Cython封装了ffmpeg的接口,所以实际调用的还是ffmpeg。

PyAV安装

PyAV是跨平台的,可以根据自己的环境和平台选择安装。

Windows安装PyAV:

在Windows下安装PyAV可以参照博客https://blog.csdn.net/Dillon2015/article/details/91358179

Mac OS X和Ubuntu上安装PyAV:

在Mac OS X和Ubuntu上安装PyAV可以参考官网安装方法

PyAV使用

PyAV提供了非常方便的接口使开发者不需要太关注底层细节。

视频分割为独立的帧

有的时候做处理时需要将一段视频按帧分成一张张图像,在ffmpeg命令行中只需要一条命令:

ffmpeg –i test.avi –r 1 –f image2 image-%3d.jpeg

-r表示每秒提取图像的数量,如果等于帧率则会将所有帧都提取出来。

在PyAV中实现同样的功能也很简单,

import av
​
container = av.open(path_to_video)
#path_to_video是你视频的路径
for frame in container.decode(video=0):
    frame.to_image().save('frame-%04d.jpg' % frame.index)

保存关键帧

对于一个视频序列来说并不是所有帧都一样,因为视频编码在进行帧间预测时会出现相互参考的情况,如果一帧的参考帧丢失或损坏了那么这一帧就无法正确解码,所以对于那些用于被参考的帧就相对更重要了。

av.video.frame.VideoFrame类中有一个属性key_frame用以表示该帧是否是关键帧。

import av
import av.datasets
​
container = av.open(path_to_video)
# Signal that we only want to look at keyframes.
stream = container.streams.video[0]
stream.codec_context.skip_frame = 'NONKEY'
​
for frame in container.decode(stream):
    # We use `frame.pts` as `frame.index` won't make must sense with the `skip_frame`.
    frame.to_image().save(
        'night-sky.{:04d}.jpg'.format(frame.pts),
        quality=80,
    )

在以上代码中跳过了非关键帧,将所有关键帧保存下来。

视频转封装

视频转封装就是改变视频的封装格式而不改变其中视频流、音频流等的编码方式,例如从mp4->mkv

过程如下:

 

import av
import av.datasets
​
input_ = av.open(path_to_video)
output = av.open('remuxed.mkv', 'w')
​
# Make an output stream using the input as a template. This copies the stream
# setup from one to the other.
in_stream = input_.streams.video[0]
out_stream = output.add_stream(template=in_stream)
​
for packet in input_.demux(in_stream):
    # We need to skip the "flushing" packets that `demux` generates.
    if packet.dts is None:
        continue
​
    # We need to assign the packet to the new stream.
    packet.stream = out_stream
    output.mux(packet)
​
output.close()

生成视频

PyAV还可以和numpy配合使用,直接将ndarray转换成视频帧,使得对帧的操作更加灵活和方便。

from __future__ import division
​
import numpy as np
​
import av
​
duration = 4
fps = 24
total_frames = duration * fps
container = av.open('test.mp4', mode='w')
stream = container.add_stream('mpeg4', rate=fps)
stream.width = 480
stream.height = 320
stream.pix_fmt = 'yuv420p'
​
for frame_i in range(total_frames):
    img = np.empty((480, 320, 3))
    img[:, :, 0] = 0.5 + 0.5 * np.sin(2 * np.pi * (0 / 3 + frame_i / total_frames))
    img[:, :, 1] = 0.5 + 0.5 * np.sin(2 * np.pi * (1 / 3 + frame_i / total_frames))
    img[:, :, 2] = 0.5 + 0.5 * np.sin(2 * np.pi * (2 / 3 + frame_i / total_frames))
​
    img = np.round(255 * img).astype(np.uint8)
    img = np.clip(img, 0, 255)
​
    frame = av.VideoFrame.from_ndarray(img, format='rgb24')
    for packet in stream.encode(frame):
        container.mux(packet)
​
#Flush stream
for packet in stream.encode():
    container.mux(packet)
​
#Close the file
container.close()

以上代码生成了一段480x320帧率24fps的视频。

小结

PyAV还要更多更强大的功能,感兴趣的小伙伴可以自己安装试试哦。

感兴趣的请关注微信公众号Video Coding

 

  • 23
    点赞
  • 82
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: 在Python使用FFmpeg需要通过调用FFmpeg的命令行接口或使用FFmpegPython模块,例如PyAVFFmpeg-python使用这些工具,可以将视频或音频文件转换为不同格式,从视频提取帧或音频流等。要使用它们,需要先安装FFmpeg并了解一些基本的FFmpeg命令选项。 ### 回答2: FFmpeg是一款开源的音视频处理工具,支持多种格式的音视频编解码、转换、过滤、编辑等操作。Python作为一个广泛应用的编程语言,也提供了使用FFmpeg的库和接口,方便开发者在Python程序使用FFmpeg功能。 一. 安装FFmpeg使用FFmpeg之前,需要先将其安装到本地计算机上。可以从FFmpeg官网下载安装包,并将其解压到指定目录下。也可以使用终端命令,使用包管理器安装FFmpeg。例如在Ubuntu系统,可以使用以下命令安装FFmpeg: sudo apt-get update sudo apt-get install ffmpeg 二. 安装ffmpeg-python库 为了能够在Python程序使用FFmpeg,还需要安装ffmpeg-python库。可以使用pip包管理器进行安装,运行以下命令: pip install ffmpeg-python 三. 使用ffmpeg-python库 安装完ffmpeg-python库后,就可以在Python使用FFmpeg了。可以使用Python的subprocess模块,调用FFmpeg的命令行接口进行音视频处理。也可以直接使用ffmpeg-python库提供的Python封装,通过Python代码进行音视频处理。 例如,使用FFmpeg将mp4文件转换为gif动图格式,可以使用以下的Python代码: import ffmpeg input_file = "example.mp4" output_file = "example.gif" stream = ffmpeg.input(input_file) stream = ffmpeg.filter(stream, "fps", fps=10, round="up") stream = ffmpeg.output(stream, output_file) ffmpeg.run(stream) 这段代码首先导入了ffmpeg库,然后定义了输入文件路径和输出文件路径。接着创建了一个输入流,使用filter方法添加了一个帧率滤镜,将帧率设定为10帧每秒。再将经过滤镜处理的输入流输出到指定路径。最后执行ffmpeg命令,将视频文件转换为gif动图。 另外,ffmpeg-python库还提供了许多其他的方法和接口,支持音视频编解码、格式转换、剪切、合并、添加水印等功能。根据具体的需求,可以查阅官方文档,使用ffmpeg-python库完成音视频相关的处理任务。 总结: 在Python使用FFmpeg需要安装FFmpegffmpeg-python库,可以通过调用命令行接口或使用Python封装,进行音视频处理。根据具体需求,可以使用ffmpeg-python提供的各种方法和接口,完成音视频的编解码、格式转换等相关操作。 ### 回答3: ffmpeg是一款功能强大的开源视频和音频处理工具,其包括视频转码、裁剪、剪辑、压缩、合并等多种功能。Python是一种高级编程语言,天生具有处理大数据和科学计算的能力,非常适合与ffmpeg进行结合使用。下面是详细介绍如何在Python使用ffmpeg的方法。 一、安装ffmpeg 要在Python使用ffmpeg,首先需要将其安装在计算机上。具体安装过程如下: 1. 访问ffmpeg官方网站(https://www.ffmpeg.org/),下载适用于您的操作系统的最新版本。 2. 将下载的文件解压缩,并将ffmpeg可执行文件添加到系统路径。 3. 确认ffmpeg是否能够正常工作。可以在终端或命令提示符输入“ffmpeg”,如果正确安装,则应该能够看到ffmpeg的版本信息。 二、使用ffmpy库 ffmpy是Python的一款轻量级ffmpeg封装库,可以通过Python代码来控制ffmpeg。 1. 安装ffmpy 要使用ffmpy,首先需要将其安装在计算机上。可以通过pip安装,具体命令如下: ``` pip install ffmpy ``` 2. 使用ffmpy 通过ffmpy,可以在Python运行各种ffmpeg操作。以下是几个例子: 1)视频转码 ``` from ffmpy import FFmpeg input_file = 'source.mp4' output_file = 'result.avi' ff = FFmpeg(inputs={input_file: None}, outputs={output_file: '-c:v mpeg4 -b:v 800k'}) ff.run() ``` 该代码将源文件source.mp4转换为以800k比特率压缩的AVI文件。其,inputs为字典类型,包含源文件和任意数量的输入流。outputs也是字典类型,包含输出文件和任意数量的参数。 2)音频提取 ``` from ffmpy import FFmpeg input_file = 'source.mp4' output_file = 'audio.mp3' ff = FFmpeg(inputs={input_file: None}, outputs={output_file: '-vn -c:a libmp3lame'}) ff.run() ``` 该代码从MP4视频文件source.mp4提取音频,并将其保存为MP3文件audio.mp3。参数'-vn'指示仅提取对应于音频流的流,而'-c:a libmp3lame'指示使用LAME MP3编码器对音频进行编码。 3)剪辑视频 ``` from ffmpy import FFmpeg input_file = 'source.mp4' output_file = 'result.mp4' ff = FFmpeg(inputs={input_file: None}, outputs={output_file: '-ss 00:00:03 -to 00:00:08'}) ff.run() ``` 该代码将源文件source.mp4剪切到3秒到8秒之间,并将结果保存为MP4文件result.mp4。参数'-ss 00:00:03'指示从3秒开始,而'-to 00:00:08'指示在8秒处停止。 三、其他方式 使用subprocess 也可以通过使用Python subprocess模块来调用ffmpeg。以下是一个例子: ``` import subprocess input_file = 'source.mp4' output_file = 'result.avi' command = ('ffmpeg -i "' + input_file + '" -c:v mpeg4 -b:v 800k "' + output_file + '"') subprocess.call(command, shell=True) ``` 此代码使用ffmpeg将源.mp4视频文件转换为800k比特率的MPEG-4视频文件。 使用moviepy moviepy是一种用于视频编辑和处理的Python模块。它包装了许多常见的视频操作,并提供了许多可用的过渡和效果。以下是一个示例: ``` from moviepy.editor import * input_file = 'source.mp4' output_file = 'result.avi' clip = VideoFileClip(input_file).resize(height=360) clip.write_videofile(output_file, bitrate="800k") ``` 此代码使用moviepy从源.mp4文件裁剪一个360高的视频,并将其压缩到800k比特率的AVI文件。 总结 以上是几种在Python使用ffmpeg的方法,可以根据自己的需要选择适合的方法。无论您选择哪种方式,ffmpeg都是处理视频和音频的强大工具,可以满足各种需求,使视频处理变得更为简单。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值