参考学习网站 https://ffmpeg.org/ffmpeg.html?tdsourcetag=s_pctim_aiomsg
本文demo地址:FFmpegDemo 先睹为快
1.什么是FFmpeg,它可以做什么?
答:FFmpeg 是一个非常快速的视频和音频转换器,//也可以从现场音频/视频源抓取。它还可以在任意采样率之间进行转换,并使用高质量的多相滤波器动态调整视频大小。
2.如何下载?
答:https://ffmpeg.org/ 选择Download,选择自己适合的平台下载安装即可。
#3.如何使用FFmpeg? #
答:首先看它的命令形式 ffmpeg [global_options] {[input_file_options] -i input_url} … {[output_file_options] output_url} …
global_options 参数影响后面的输入输出
-i 通过该参数可以指定输入参数
举个列子:
//demo 音乐 https://m10.music.126.net/20181018094157/f58f270a51e5cbe38b943e788b78f6a1/ymusic/6b35/02c0/4844/300abb010d844be1941e5555ba373a2d.mp3
FFmpeg -i https://m10.music.126.net/20181018094157/f58f270a51e5cbe38b943e788b78f6a1/ymusic/6b35/02c0/4844/300abb010d844be1941e5555ba373a2d.mp3 demo.mp3
通过ffmpeg -i命令 制定了一个输入文件,该文件可以是 本地文件,可以是一个url文件,也可以是一个流,最后指定一个输出文件 当然可以指定多个输出文件
ffmpeg -i F:\blog\ffmpeg\test.mp4 -r 10 test2.mp4
设置帧率,当帧率低于16fps的时候会感觉明显的卡顿
ffmpeg -i F:\blog\ffmpeg\test.mp4 -b:v 64k -bufsize 64k test3.mp4
通过设置视频的比特率可以调整视频的清晰度,并且可以减小文件的大小
因此我们可以用适当的调整比特率的方式来减小视频大小方便传输
4.ffmpeg中间过程是怎么处理的?
_______ ______________
| | | |
| input | demuxer | encoded data | decoder
| file | ---------> | packets | -----+
|_______| |______________| |
v
_________
| |
| decoded |
| frames |
|_________|
________ ______________ |
| | | | |
| output | <-------- | encoded data | <----+
| file | muxer | packets | encoder
ffmpeg首先从输入文件------到解码数据------到解码帧数据----然后通过一系列操作对帧数据编码操作-----然后打包编码数据----最后输出文件
(调用libavformat库(包含多路分离器)来读取输入文件并从中获取包含编码数据的数据包。然后将编码的数据包传递给解码器。解码器产生未压缩的帧(原始视频/ PCM音频/ …),可以通过过滤进一步处理(参见下一节)。在过滤之后,帧被传递到编码器,编码器对它们进行编码并输出编码的分组。最后,这些传递给复用器,复用器将编码的数据包写入输出文件。)
相关库:libavformat----> libavformat 用于对音频和视频编码解码的支持库
5.FFmpeg基础学习
5.1 Filtering
( Filtering https://ffmpeg.org/ffmpeg.html?tdsourcetag=s_pctim_aiomsg#toc-Filtering)
ffmpeg 可以对输入的音频视频文件做过滤处理(滤波器),ffmpeg支持2种(simple and complex)方式。
5.1.1 简单的滤波器 Simple filtergraphs
_________ ______________
| | | |
| decoded | | encoded data |
| frames |\ _ | packets |
|_________| \ /||______________|
\ __________ /
simple _\|| | / encoder
filtergraph | filtered |/
| frames |
|__________|
简单的滤波器图是那些只有一个输入和输出的滤波器,它们都是相同的类型,简单的过滤器图使用per-stream -filter选项配置(分别使用-vf和-af别名用于视频和音频)。一个简单的视频滤镜图可以看起来像这样:
_______ _____________ _______ ________
| | | | | | | |
| input | ---> | deinterlace | ---> | scale | ---> | output |
|_______| |_____________| |_______| |________|
请注意,某些过滤器会更改帧属性但不会更改帧内容。例如。之前提到修改fps过滤器会更改帧数,但不会触及帧内容。另一个例子是setpts过滤器,它只设置时间戳,否则不改变帧。
5.1.2 复杂的滤波器 Complex filtergraphs
略
#6.其他 #:
1.ffprobe 查看文件信息
C:\ffmpeg\bin>ffprobe a.mp3
ffprobe version N-92132-g0a41a8bf29 Copyright (c) 2007-2018 the FFmpeg developers
built with gcc 8.2.1 (GCC) 20180813
configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libmfx --enable-amf --enable-ffnvcodec --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth
libavutil 56. 19.101 / 56. 19.101
libavcodec 58. 32.100 / 58. 32.100
libavformat 58. 18.104 / 58. 18.104
libavdevice 58. 4.105 / 58. 4.105
libavfilter 7. 33.100 / 7. 33.100
libswscale 5. 2.100 / 5. 2.100
libswresample 3. 2.100 / 3. 2.100
libpostproc 55. 2.100 / 55. 2.100
Input #0, mp3, from 'a.mp3':
Metadata:
encoder : Lavf57.25.100
comment : 163 key(Don't modify):L64FU3W4YxX3ZFTmbZ+8/d5BxaaSkA01PActFA9tMYQgfPEbS3UOf+TJCF/3U7ihjDBK+WaiIUDoa9od5fLSYh1E3OM1DCttgrSnXijItYvczfKqVdtIGcos5VonPA42nWYjFloLWgArbhvkhjVGPnGK/fONCGPzPorxviiBN8QmT/Yslk7NaYNvjb84VzJx+dUleNsCJMOw7qV2zP8/de0zJYVEbaBTZGZnfkYih
album : 热门华语7
title : CCTV新闻联播片头
artist : 群星
disc : 1
track : 1
Duration: 00:00:16.72, start: 0.025056, bitrate: 202 kb/s
Stream #0:0: Audio: mp3, 44100 Hz, stereo, fltp, 128 kb/s
Metadata:
encoder : Lavc57.24
Stream #0:1: Video: mjpeg, yuvj444p(pc, bt470bg/unknown/unknown), 640x640 [SAR 72:72 DAR 1:1], 90k tbr, 90k tbn, 90k tbc
Metadata:
comment : Media (e.g. label side of CD)
1.合并2个音频流(amix),
ffmpeg -i b.mp3 -i a.mp3 -filter_complex amix=inputs=2:duration=longest -f mp3 output2.mp3
2.分离流
ffmpeg -i INPUT -map 0:1 out.wav
可以通过查看流的信息得知文件信息中包含几个Stream(如下所示)
Stream #0:0: Audio: mp3, 44100 Hz, stereo, fltp, 128 kb/s
Metadata:
encoder : Lavc57.24
Stream #0:1: Video: mjpeg, yuvj444p(pc, bt470bg/unknown/unknown), 640x640 [SAR 72:72 DAR 1:1],
这里表示该文件包含2个流信息,一个是mp3类型,一个是封面 所以我们可以使用下面的命令,把jpeg图片取出来
ffmpeg -i a.mp3 -map 0:1 a.png
音频倍数(atempo)
ffmpeg -i a.mp3 -filter_complex atempo=2 -y aaaa.mp3