ffmpeg抽取音视频文件中的音频流

音频流类型

音频流主流上可分为AAC、m4a、mp3,

AAC与m4a的区别

AAC是一种音频编码形式,m4a是一种封装形式。打个比方,如同橙汁可以被封装在易拉罐里一样,aac如同橙汁,m4a如同易拉罐。m4a是一种多功能的封装工具,可以装进无损的 Apple Lossless 音乐(就是苹果手机里的无损音乐),甚至MP3也可以封装进m4a里。

aac有两种,DVD时代的 MPEG-2 AAC 和 高清时代的 MPEG-4 AAC。比较老的 MPEG-2 AAC 标准已经淘汰了,这种编码的音频通常用 .aac 后缀;现在的 aac 音频都是 MPEG-4 AAC 标准的,一般都是用 m4a 来封装,后缀是 .m4a 。

m4a最早就是苹果用来封装它自己的 Apple Lossless 的,苹果的全系列设备都可以完美支持。

采用AAC音频编码形式并且扩展名有AAC.M4A.MP4这三种,不同的硬件可能支持不同的扩展名.如果遇到你的播放器支持播放AAC却不能播放你放进去的AAC歌曲时.可以改正下扩展名就可以了。

综上所述M4A与AAC的区别就是,他是属于AAC众多编码中的一种,而且是属于编码众多编码中优化最好的一种,所以通过该编码压缩处理的音乐,音质也是极好极好的。

AAC与mp3的区别

两者都是有损压缩音频编码的方式,但市面上显然mp3的普及度要比aac高的多

用ffmpeg查看视频的信息

使用-i参数可以在命令行中显示视频的信息,包含视频文件的音视频编解码格式,视频时长,比特率等,方便我们做进一步的处理

ffmpeg.exe -i 1.mp4

输出如下

在这里插入图片描述

用ffmpeg抽取AAC音频流

在命令行中使用命令

ffmpeg.exe -i 1.mp4 -vn -acodec copy output.aac

即可从1.mp4中抽取出音频流output.aac

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0vpsVlzr-1582979785026)(F2079A73B6A54F36932F67F2EEFDA706)]

从ffmpeg的输出信息中可以看到,输入的视频文件中包含视频流和音频流,输出信息中只有音频流

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FWyb2jaZ-1582979785026)(E9A06FE9301646499F213F8181C52D24)]

从AAC文件中获取音轨

音轨是什么东西

音轨就是在音序器软件中看到的一条一条的平行“轨道”。每条音轨分别定义了该条音轨的属性,如音轨的音色,音色库,通道数,输入/输出端口,音量等

分离人声和背景声

提取音轨与分离人声和背景声可能不是一回事,尝试使用一个叫做spleeter把一个视频中人声和背景声区分开来

测试系统介绍

  • 系统版本为:ubuntu14.04.5
  • ffmpeg版本:采用apt-get ffmpeg自动安装
  • Python版本:3.6.5(anaconda3 5.2自带版本)

安装

因为是测试,所以没有使用GPU版本,采用的是CPU版本,可以通过pip来安装

pip install spleeter

需要使用的TensorFlow版本为1.4,对应的python版本最大为3.6

测试

测试使用两个文件,第一个为自带音频文件的audio_example.mp3;第二个为视频文件2.mp4

分别使用命令,在文件夹output得到运行后的结果

./spleeter separate -i audio_example.mp3 -p spleeter:2stems -o output
./spleeter separate -i 2.mp4 -p spleeter:2stems -o output

输出文件夹内容:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-anM6t27u-1582979785026)(F3FE22CAFF7148B2B025AD6C2D67E267)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QQbkaBWU-1582979785026)(5CCA40A84EEB4EA1B9A6C0F330812ED4)]

在使用的时候会自动下载模型文件,也可以预先下载后放到文件夹/pretrained_models/2stems中,跟spleeter同级目录

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D5Dox8ca-1582979785026)(1BAE799B729D40EA88D76990EFD9B027)]

查看效果

输出的.wav文件比原视频要大不少,不过结果还是不错的

能正确分离出来了人声,背景声虽然略带人声,但应该是做了模糊,会不那么清晰

源文件和输出文件可见下载:
https://download.csdn.net/download/zengraoli/12201519

ffmpeg抽取音视频文件中的H264视频流

有时在视频编辑场景中需要将视频流提取出来进行编辑,比如给视频重新配音等,这时就需要单独提取视频流了,用ffmpeg的命令提取出视频文件的视频流如下

ffmpeg.exe -i 1.mp4 -vcodec copy -an output.mp4

用-i查看输出视频,可看出仅有一个视频流

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KMWEQwrM-1582979785026)(2D9FC4BABD294403BDAFB55C821949F7)]

ffmpeg抽取音视频文件中的H265数据

首先需要看一下包含h265视频的视频流显示的内容

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NqdVRElY-1582979785027)(DD5385EA03454241ACD346515FCC79C7)]

提取h265视频流的方式则对应为

ffmpeg.exe -i video-h265.mkv -vcodec copy -an 2.mkv

如果h265视频包含在mp4容器里,需要使用如下命令

ffmpeg.exe -i video-h265.mp4 -vcodec copy -an -bsf hevc_mp4toannexb -f hevc

因为在mp4中存储的视频数据并不是标准的annexb格式,需要将mp4的视频存储格式存储为annexb格式

来看看提取出来的h265视频

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-csvI3nnP-1582979785027)(C4F5866CFF5C471AB27D92B8240E82B8)]

用支持的播放器,比如WMP即可直接播放

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-66plenEa-1582979785027)(58AD4FD4848243E596DD85F602296F45)]

参考链接

Logo

致力于链接即构和开发者,提供实时互动和元宇宙领域的前沿洞察、技术分享和丰富的开发者活动,共建实时互动世界。

更多推荐