FFmpeg命令行实践
- 1 概述
- 2 基本原理
- 3 命令行选项
- 4 命令行实践
- 4.1 音频转换
- 4.2 视频转换
- 4.2.1提取mkv中视频流转为h264裸流
- 4.2.2 提取前5s时间转h264
- 4.2.3 根据codec进行转换
- 4.2.4 设置输出码率,帧率
- 4.2.5 设置输出分辨率
- 4.2.5 转yuv裸流文件
- 5 结语
1 概述
参考官方文档:https://www.ffmpeg.org/ffmpeg.html
官方给出的定义:ffmpeg是一个非常快速的音视频转换器。
2 基本原理
FFmpeg实现音视频转换基本原理,首先输入文件经过解封装得到编码的数据–>经过解码器得到原始的的音视频数据–>再经过编码器重新编码成目标codec,最终经过封装器得到输出文件。整个流程是一个面向过程的实现方式,从输入经过一系列处理得到最终输出文件,比较容易理解。
_______ ______________
| | | |
| input | demuxer | encoded data | decoder
| file | ---------> | packets | -----+
|_______| |______________| |
v
_________
| |
| decoded |
| frames |
|_________|
________ ______________ |
| | | | |
| output | <-------- | encoded data | <----+
| file | muxer | packets | encoder
|________| |______________|
3 命令行选项
FFmpeg命令行分为三个部分,一个是全局选项,一个是输入选项和一个输出选项。
ffmpeg [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url} ...
学习命令行肯定离不开使用帮助,这么多的命令直接记住是不可能的,也没啥必要,用到时候再查比较靠谱,当然常见的用多了自然也记住了。这里用的是ffmpeg 3.4.2-2版本,看着也不是很多命令这边直译一下其中比较常用的命令选项基本含义。
ffmpeg -h
全局选项 :
-y 覆盖输出文件(危险)
-n 不覆盖输出文件
-filter_threads filter使用的线程数(默认是cpu数)
-filter_complex_threads filter_complex线程数
-stats 打印编码进度/统计信息
-vol volume 修改音频音量 (256=normal)
文件的主要选项(输入/输出):
-f fmt 强制输入或输出文件格式
-c codec 指定编解码名称
-codec codec 指定编解码名称
-t duration 持续时间(单位s)
-to time_stop 停止时间
-fs limit_size 文件大小限制
-ss time_off 设置起始时间偏移
-sseof time_off 设置反向偏移(距结束位置)
-seek_timestamp enable/disable seeking by timestamp with -ss
-timestamp time 设置录制时间戳 ('now' to set the current time)
-metadata string=string 添加元数据键值对
-program title=string:st=number... add program with specified streams
-target type 设置目标文件类型 ("vcd", "svcd", "dvd", "dv" or "dv50" with optional prefixes "pal-", "ntsc-" or "film-")
-apad 填充输出音频流
-frames number 设置输出多少帧数
视频选项:
-vframes number 设置输出的视频帧数
-r rate 设置帧率(Hz 值、分数或缩写)
-s size 设置帧大小(WxH or abbreviation)
-aspect aspect 指定的视频显示纵横比 (4:3, 16:9 or 1.3333, 1.7777)
-bits_per_raw_sample number set the number of bits per raw sample
-vn disable video
-vcodec codec 设置视频编解码器。别名-codec:v
-timecode hh:mm:ss[:;.]ff 指定用于初始的时间码
-pass n 用于进行两次视频编码 (1 to 3)
-vf filter_graph 别名-filter:v
-ab bitrate 指定音频码率 (please use -b:a)
-b bitrate 指定视频码率 (please use -b:v)
-dn 关闭视频数据
音频选项:
-aframes number 设置音频输出帧数
-aq quality -q:a 的别名
-ar rate 设置音频采样率 (in Hz)
-ac channels 设置音频通道数
-an 关闭音频数据
-acodec codec 指定音频编码器别名:-c:a
-vol volume 设置音频音量 (256=normal)
-af filter_graph 设置音频滤镜
字幕选项:
-s size 设置回调帧分辨率 (WxH or abbreviation)
-sn 关闭字幕
-scodec codec 设置字幕codec ('copy' to copy stream)
-fix_sub_duration 修复字幕持续时间
-canvas_size size 设置用于渲染字幕的画布大小(WxH or abbreviation)
4 命令行实践
4.1 音频转换
不覆盖文件的情况下将输入封装音视频Titanic.mkv文件中提取音频部分数据保存成wav;其中音频输出采样率设置为16k,音频通道设置为单通道,音频编码数据设置为pcm16。
ffmpeg -n -i Titanic.mkv -ar 16000 -ac 1 -acodec pcm_s16le Titanic_s16le.wav
输出文件利用mediainfo查看如下:
这个用来转换为任意需要的编码格式,采样率和采样通道数。具体codec支持的编码方式可以利用下面命令进行查看
#查看本机音视频支持的编码方式
ffmpeg -encoders
#其他参数查看方式也是这样
#查看本机音视频支持的解码方式
ffmpeg -decoders
#查看本机音视频支持的解码方式
ffmpeg -decoders
#查看本机音视频支持的文件格式
ffmpeg -formats
#查看本机音视频支持的滤镜格式
ffmpeg -filters
4.2 视频转换
4.2.1提取mkv中视频流转为h264裸流
ffmpeg -n -i Titanic.mkv Titanic.h264
4.2.2 提取前5s时间转h264
ffmpeg -y -t 5 -i Titanic.mkv Titanic.h264
4.2.3 根据codec进行转换
ffmpeg -y -t 5 -i Titanic.mkv -codec libx264 Titanic.h264
4.2.4 设置输出码率,帧率
码率设置为4M/s帧率设置为1帧/s
ffmpeg -y -t 5 -i Titanic.mkv -codec libx264 -b:v 4M -r:v 1 Titanic.h264
4.2.5 设置输出分辨率
ffmpeg -y -t 5 -i Titanic.mkv -codec libx264 -b:v 4M -r:v 1 -s 1080x720 Titanic.h264
4.2.5 转yuv裸流文件
ffmpeg -y -t 5 -i Titanic.h264 Titanic.yuv
5 结语
本文主要是针对常用命令行进行实操,熟悉基本的命令选项,对应比较高级的用法没有涉及到,比如滤镜功能,具体使用方法还是需要看官方文档。