1. 安装
- 在FFmpeg的下载页面下载需要的版本,目前有Linux、Windows、MacOS版本 & Source code
- 下载传送门:
- 官网:https://ffmpeg.org/download.html
- Github: https://github.com/FFmpeg/FFmpeg
- 编译安装后,如果发现没有 ffplay ,一般是缺少 sdk 共享库
- 通过这条命令安装:
sudo apt-get install libsdk1.2-dev libsdk2-dev
Simple Use
- 从源代码进行构建:
1
2
3
4
5
6
7
8
9sudo apt install yasm
#***下载最新版release,假设下载后的release名称为:n4.0.1***
name=n4.0.1
tar -xvf $name
cd ffmpeg
./configure --enable-x264
#如果有问题,直接 ./configure
core=`cat /proc/cpuinfo| grep "processor"| wc -l`
sudo make -j $core && sudo make install
Deep Customization
- 进入源代码根目录,使用
./configure --help
查看所有参数和信息 - 选择开启格外的功能
--enable-***
, 开启之前一般需要安装对应的 *lib 库 - 如启用 hevc (H265) 支持, 我们可以这样
sudo apt search x265
, 然后根据返回的结果自行判断。一般需要安装的共享库的名称规范是:lib***-dev
或***-dev
。如x265
就是libx265-dev
, 通过sudo apt-get install libx265-dev
进行安装 - 对于想要开启
NVIDIA
硬解支持的话,按照 以下方法- 确保自己有 NVIDIA显卡 ,而且 支持硬解码
- 安装 cuda (推荐最新版), 选完对应版本后在 Download 那边有安装说明。 传送门…
- 安装 Video Codec SDK
- git clone https://git.videolan.org/git/ffmpeg/nv-codec-headers.git
- cd nv-codec-headers && sudo make install && cd –
- 将 nvcc 添加到
PATH
- 可以在
./configure
后面添加--prefix={dir}
来指定安装目录 ./configure --enable-cuda-nvcc --enable-cuvid --enable-nvenc --enable-nonfree --enable-libnpp --extra-cflags=-I/usr/local/cuda/include --extra-ldflags=-L/usr/local/cuda/lib64
- 通过 APT 源进行安装的 ffmpeg 默认参数
1 | root@ubuntu:~# ffmpeg |
2. 介绍
从源代码编译后,会安装 ffmpeg、ffprobe、ffplay
- ffmpeg 主要用于转码
- ffprobe 主要用于查看媒体文件信息
- ffplay 不仅仅是播放器,同时也是测试 ffmpeg 的 codec 引擎、format 引擎、filter 引擎的工具,并且还可以进行可视化的媒体参数分析
3. 使用
1. 初级部分
1. 音视频文件转 MP4: ffmpeg -i input.flv -c copy -f mp4 output.mp4
2. 音视频文件转 FLV: ffmpeg -i input.mp4 -c copy -f flv output.flv
若音频有问题或者封装出错,尝试:
ffmpeg -i input.mp4 -vcodec copy -acodec aac -f flv output.flv
3. 提取音视频文件里面的AAC音频流: ffmpeg -i input.mp4 -vn -acodec copy output.aac
4. FFmpeg 输出MP3: ffmpeg -i INPUT -acodec libmp3lame -b:a 320k output.mp3
5. 提取音视频文件里面的H.264视频流: ffmpeg -i output.mp4 -an -vcodec copy -bsf:v h264_mp4toannexb output.h264
6. 使用AAC和H.264文件生成mp4文件: ffmpeg -i input.aac -i input.h264 -acodec copy -bsf:a aac_adtstoasc -vcodec copy -f mp4 output.mp4
7. 对音频文件的编码做转换: ffmpeg -i input.wav -acodec libfdk_aac output.aac
8. 添加srt格式的字幕: ffmpeg -i video.avi -vf subtitles=subtitle.srt out.avi
9. 从现有视频文件中抽离字幕并且烧录进新的视频中:ffmpeg -i video.mkv -vf subtitles=video.mkv out.avi
10. 添加ass格式的字幕:ffmpeg -i video.avi -vf "ass=subtitle.ass" out.avi
或者你可以先将srt转换成ass格式:ffmpeg -i subtitle.srt subtitle.ass
11. 添加idx/sub格式的字幕: ffmpeg -i 1.mp4 -i 1.sub -i 1.idx -filter_complex "[0:v][2:s]overlay=0:H-h" -c:v libx264 out.mp4
这个会将图片类型的sub/idx格式字幕烧录进视频文件中。
2. 高级部分
Advance: FFmpeg 流媒体
-re: 实时推送
8. 录制 & 发布 RTMP 流
- 发布RTMP流:
ffmpeg -i input.mp4 -c copy -f flv rtmp://localhost/live/class
live 为发布点,class 为流名称
自定义发布点为 live1、流名称为 class1,并且实时推流ffmpeg -re -i input.mp4 -c copy -f flv -rtmp_app live1 -rtmp_playpath class1 rtmp://localhost
1. 录制RTMP流:ffmpeg -i rtmp://localhost/live/class -c copy -f flv output.flv
9. 录制 HTTP 流
- FLV直播流:
ffmpeg -i http://localhost/live.flv -c copy -f flv output.flv
- TS直播流:
ffmpeg -i http://localhost/live.ts -c copy -f flv output.flv
- HLS直播流:
ffmpeg -i http://localhost/live.m3u8 -c copy -f flv output.flv
- 设置 http headers & user_agent & seekable 等参数 :
ffmpeg -ss 300 -seekable 1 -user_agent "CC's Player" -headers "referer: http://localhost/index.html" -i http://localhost/live/class.flv -c copy -f flv -y ouput.flv
10. 录制 & 发布 TCP/UDP 流
发布TCP流:
ffmpeg -re -i input.mp4 -c copy -f flv tcp://127.0.0.1:123/live/stream
设置缓冲区为 4096 bit:
ffmpeg -re -i input.mp4 -c copy -send_buffer_size 4096 -f flv tcp://127.0.0.1:123/live/stream
录制TCP流:
ffmpeg -listen 1 -f flv -i tcp://127.0.0.1/live/stream -c copy -f flv output.flv
设置监听端口超时 listen_timeout (5秒):
ffmpeg -listen_timeout 5000 -listen 1 -f flv -i tcp://127.0.0.1/live/stream -c copy -f flv output.flv
设置TCP流拉取超时参数 timeout (200秒):ffmpeg -timeout 20000000 -listen 1 -f flv -i tcp://127.0.0.1/live/stream -c copy -f flv output.flv
发布UDP流:
ffmpeg -re -i input.mp4 -c copy -localport 23456 -f flv udp://127.0.0.1:123/live/stream
使用FFmpeg的UDP传输数据时,默认会由系统分配本地端口,使用localport可以设置监听本地端口,抓包可以看到有一个 23456 -> 123 的端口转发
Advance: FFmpeg 桌面录制
11. Windows桌面 录制
参数 | 作用 |
---|---|
draw_mouse | 是否采集鼠标指针 |
show_region | 是否绘制采集边界 |
framerate | 设置视频帧率,默认25帧,两个标准值为pal、ntsc |
video_size | 设置视频分辨率 |
offset_x | 采集区域偏移x个像素 |
offset_y | 采集区域偏移x个像素 |
- 整个桌面(设定帧率为60):
./ffmpeg.exe -f gdigrab -framerate 60 -i desktop output.mp4
- 某个窗口(假设窗口名为ffmpeg):
./ffmpeg.exe -f gdigrab -framerate 60 -i title=ffmpeg output.mp4
- 录制带偏移量的视频:
./ffmpeg.exe -f gdigrab -framerate 60 -offset_x 50 -offset_y 50 -video_size 400x400 -i title=ffmpeg output.mp4