首页 > 编程知识 正文

ffmpeg画质增强(播放器无缝播放)

时间:2023-05-03 22:42:35 阅读:80995 作者:3543

作者: zxdhk

来源: Python技术

最近,有一项新任务需要将比赛的视频分割成2分钟以内的短部分并发布到短视频平台上。

我以为是一次性的工作,但是比赛的视频数据巨大,视频文件的长度不同,不能用手处理。 于是Python又救了我。

等什么,开始做吧!

最重要的事

无论做什么事,都要分析最重要的事情是什么,然后集中精力攻略,再继续寻找最重要的事情。

对我们这个任务来说,不能说是个大项目,但还是要开始找最重要的事情,一步一步来,最终解决整个问题。

从整体上看,需要从一个目录导入视频文件,然后裁剪每个视频文件,最后保存处理的文件。

在这个过程中,最重要的是什么? 我想是视频裁剪。 如果不能方便地裁剪视频,其他所有的工作都是徒劳的,不是吗?

裁剪视频

现在很流行短视频。 有很多视频编辑软件,功能丰富。 另一方面,如果只需要裁剪功能,而需要通过编程进行调用,则最合适的不是ffmpeg[1]。

ffmpeg是命令行工具,功能强大,可以通过程序调用。

从ffmpeg官网下载了对应的操作系统版本,我下载了Windows版[2]。

下载并解压缩到目录中,然后将目录下的xqdz放置在环境变量中。 然后打开命令行,并输入:

fmpeg -版本

fmpegversion 2021-10-07 -千兆- B 6a EEE 2d8B -完整_构建- .

测试后,您会看到版本信息,并注意到其位置。

在阅读文档时,用于分割视频文件的命令如下:

f mpeg-I文件名- ss开始时间- t长度- c副本

将需要I修整的文件ss以修整开始时间t作为修整结束时间或长度c的修整文件进行保存,用Python写调用:

导入子流程作为sp

def cut _视频(文件名、输出文件、开始、长度=90 ) :

cmd=' ffmpeg-I % s-ss % d-t % d-c拷贝% s ' % (文件名、开始、长度、轮廓) ) ) ) ) ) ) ) ) ) ) )

p=sp.popen(cmd,壳=真) )。

p.wait () )。

返回

使用通过参数传递给ffmpeg所需的信息,定义了在字符串模板中写入修剪命令并将参数替换为subprocess的Popen执行命令的函数。 参数shell=True表示命令作为整体p.wait ) )的重要性。 修剪需要一段时间,并且将运行另一个进程,因此必须等待运行完成后才能运行

计算分段

视频剪辑需要几个参数,特别是开始时间,怎么决定? 这件事做不好的话,裁剪工作会很麻烦。

让我们来看看裁断段的计算方法。

如果需要将视频裁剪到1分半的短部分,则需要知道目标视频文件的时间长度。

获取视频长度

是如何获得长度的? ffmpeg有另一个命令—— ff探测器。

text-align: left;">找了一下,可以合成一个命令来获取:

> ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 -i a.flv 920.667

命令比较复杂哈,可以先不用管其他参数,只要将要分析的视频文件传入就好了。命令的结果是显示一行视频文件的长度。

于是可以编写一个函数:

import subprocess as sp def get_video_duration(filename): cmd = "ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 -i %s" % filename p = sp.Popen(cmd, stdout=sp.PIPE, stderr=sp.PIPE) p.wait() strout, strerr = p.communicate() # 去掉最后的回车 ret = strout.decode("utf-8").split("n")[0] return ret 函数只有一个参数,就是视频文件路径合成命令语句,将视频文件路径替换进去用 subprocess 来执行,注意这里需要设置一下命令执行后的输出用 wait 等待命令执行完成通过 communicate 提取输出结果从结果中提取视频文件的长度,返回

分段

得到了视频长度,确定好每个分段的长度,就可以计算出需要多少分段了。

代码很简单:

import math duration = math.floor(float(get_video_duration(filename))) part = math.ceil(duration / length)

注意,计算分段时,需要进行向上取整,即用 ceil,以包含最后的一点尾巴。

得到了需要的分段数,用一个循环就可以计算出每一段的起始时间了。

获取文件

因为处理的文件很多,所以需要自动获取需要处理的文件。

方法很简单,也很常用,一般可以用 os.walk 递归获取文件,还可以自己写,具体根据实际情况。

for fname in os.listdir(dir): fname = os.path.join(dir, os.path.join(dir, fname)) basenames = os.path.basename(fname).split('.') mainname = basenames[0].split("_")[0] ...

提供视频文件所在的目录,通过 os.listdir 获取目录中的文件,然后,合成文件的绝对路径,因为调用裁剪命令时需要绝对路径比较方便。

获取文件名,是为了在后续对裁剪好的文件进行命名。

代码集成

现在每个部分都写好了,可以将代码集成起来了:

def main(dir): outdir = os.path.join(dir, "output") if not os.path.exists(outdir): os.mkdir(outdir) for fname in os.listdir(dir): fname = os.path.join(dir, os.path.join(dir, fname)) if os.path.isfile(fname): split_video(fname, outdir) main 方法是集成后的方法先创建一个裁剪好的存储目录,放在视频文件目录中的 output 目录里通过 listdir 获取到文件后,对每个文件进行处理,其中判断了一下是否为文件调用 split_video 方法开始对一个视频文件进行裁剪

总结

总体而言,这是个很简单的应用,核心功能就是调用了一个 ffmpeg 命令。

相对于技术,更重要的是如何对一个项目进行分析和分解,以及从什么地方开始。

这里的方式起始时,不断地找最重要地事情,以最重要的事情为线索不断地推进,最终以自下而上地方式解决整个问题。

期望这篇文章对你有所启发,比心。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。