一行命令实现成“吨”测试数据的转码

2020-09-04 10:53:23 浏览数 (1)

由于项目原因,在小编的测试工作中,经常需要使用各种音频、视频、图片等二进制文件进行测试。因为这些影音数据不同于文本,需要考虑的不只是字符种类和字符编码,还需要考虑文件格式和内部编码的类型,测试时往往需要使用不同格式和编码的数据。而一般情况下,我们所能获取的每条测试数据经常是只有一种格式或编码形式,这时就需要我们对这些数据进行转码。

一、几种转码方式的比较

相信各位同学或多或少都对音视频转码有所了解并掌握了其中的一两种方法,这些方法总的来说可以大致归为几种类型:可视化转码工具、命令行转码工具、在线转码服务。

从易学易用的角度来讲,可视化转码工具绝对是第一选择,以国产软件格式工厂为代表的一系列可视化工具足以满足日常中的各种转码需求,且这些软件使用起来十分简单,即使是初学者也可以很快完成转码。但缺点是参数可配置性较差,有一些参数无法自己配置,导致转码格式和测试所需存在差异。另外就是不方便进行批量操作,虽然一些软件有任务队列,但对于成千上万条数据的转换需求还是难以支持。类似的,在线转码服务也和可视化工具类似,好处是完全不需要安装任何额外软件即可完成转码,但相比之下也会受到更多限制,更加无法进行批量操作。

因此,对于经常需要转码大量影音数据,且格式、编码等参数各不相同的小编来说,只好选用命令行工具,这种工具使用起来略显麻烦,需要自己添加各种命令行配置,但一旦配置好,可以轻而易举、高效地完成大量数据的转码。在转码方面,其实有很多不同的命令行工具可供使用,有转音频的,转视频的,转图片的,而今天给大家推荐的是一个集大成者:ffmpeg。

关于ffmpeg,往期已有其他同学做过介绍:FFmpeg-音视频产品不容忽视的隐形王者。这不只是一个转码工具,而是一套强大的音视频处理解决方案,应用场景十分广泛。

二、ffmpeg的安装使用

ffmpeg的安装方式一般有两种,第一种是源码编译的方式,我们可以从官方网站获取源码,在本地进行编译、安装:

代码语言:javascript复制
wget https://ffmpeg.org/releases/ffmpeg-snapshot.tar.bz2

tar -jxvf ffmpeg-snapshot.tar.bz2
cd ffmpeg
./configure
make && make install

安装过程中可能遇到一些问题,比如缺少yasm等,网上已有各种详细的解决方案,本文不再介绍。

敲一下ffmpeg,出现提示就说明应该已经安装生效了。

第二种方式是直接下载编译好的可执行程序

http://ffmpeg.org/download.html

根据系统类型进行选择,下载后将ffmpeg所在目录添加到系统PATH或软链到/usr/bin下即可。

敲一下 ffmpeg,和之前编译安装方式出现的提示差不多,说明已经可以正常使用。

对于只需要用到转码功能的同学,这里小编墙裂推荐使用第二种方式,一是简单,二是编译好的版本已内置很多编码库,基本上常用音视频格式都已覆盖,无需再自行添加。

三、使用ffmpeg进行转码的方法

安装好了ffmpeg,我们就可以利用它进行各种音视频以及图片之间的转码了。

使用ffmpeg进行转码的基本操作十分简单,如果你不需要自定义编码参数,那么只需要使用如下命令:

代码语言:javascript复制
# 音频:
ffmpeg -i 1.m4a 1.wav
# 视频:
ffmpeg -i 1.avi 1.mp4
# 图片:
ffmpeg -i 1.jpg 1.png

是不是非常简单~但这只是基本使用方式,格式工厂等也可以实现,我们选用命令行工具的原因是想自定义一些参数设置以及进行大规模转码操作,而这些用ffmpeg都可以轻松实现,只需我们传入自定义参数即可。

举个简单的例子:比如我需要将某音频转成8000采样率、单声道的PCM格式,且不带文件头的音频文件,那么可以使用如下命令:

代码语言:javascript复制
ffmpeg -i input.mp3 -f s16le -ac 1 -ar 8000 output.pcm

其中-f为设置音频输出编码(这里使用s16le),-ac设置声道,-ar设置采样率。

由于ffmpeg的参数数量众多,本文不进行详细介绍,大家可以尝试使用-h命令获取帮助,或查看一些中文文章的介绍

https://blog.csdn.net/leixiaohua1020/article/details/12751349

四、使用ffmpeg进行批量转码的方法

由于是命令行工具,我们可以很方便地实现批量调用并转码,在linux环境下,无需借助其他手段,使用shell即可实现。为了方便调用,我们可以先将转码需要的参数写到一个shell脚本里,比如上面的例子,就可以这么写(trans_format.sh):

代码语言:javascript复制
ffmpeg -i $1.mp3 -f s16le -ac 1 -ar 8000 $1.pcm

然后获取需要转码的文件列表:

代码语言:javascript复制
find . -name "*.mp3" | sed "s/.mp3//" > audio.list

最后通过xargs命令调用shell脚本即可完成转换:

代码语言:javascript复制
cat audio.list | xargs -i ./trans_format.sh {}

如果需要转换的数据实在很多,我们还可以利用xargs并发调用方式:

代码语言:javascript复制
cat audio.list | xargs -P 10 -i ./trans_format.sh {}

这样短短一行命令,就能实现以10并发来批量进行转码操作了。此外也可以使用parallel等其他方式实现并发调用,性能可能更好。经小编测试,在10并发的情况下,使用ffmpeg可以在几小时内无压力转换几十万条短音频,效率十分可观。

小结

本文主要介绍了在测试数据转码方面的一些经验,除了可以用常用的可视化转码工具以外,我们还可以借助命令行工具来实现更为精确化、效率化的转码,对于我们在日常处理测试集时有很大帮助。此外,本文只重点介绍了ffmpeg这一个较为通用的转码工具,还有很多其他的工具可供选用,但大体的使用思路基本相同。希望可以给大家带来一些帮助。

0 人点赞