FFmpeg 开发详细入门

本文主要针对前端开发ffmpeg,其中包含

  1. ffmpeg的必备理解以及如何从官网入门
  2. 常用的ffmpeg处理命令
  3. Electron 如何使用 ffmpeg
  4. node 如果使用 ffmpeg
  5. 浏览器中如果使用 ffmpeg

ffmpeg 必备知识

建议英文不好的小伙伴,先熟读中文资料进行理念的理解。

ffmpeg [全局选项] {[输入文件选项] -i 输入文件} ... {[输出文件选项] 输出文件} ...

ffmpeg中文资料
ffmpeg官方文档
ffmpeg 一定要理解的几个概念

  1. ffmpeg 支持处理3种类型文件:视频(mp4...)、音频(mp3、wav...)、字幕(srt、ssa、smi...)
  2. 流选择器的别名是英文字母的缩写:-c (-codec)、-f(frames)


ffmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。它包括了领先的音/视频编码库。

  • libavformat:用于各种音视频封装格式的生成和解析,包括获取解码所需信息以生成解码上下文结构和读取音视频帧等功能;
  • libavcodec:用于各种类型声音/图像编解码;
  • libavutil:包含一些公共的工具函数;
  • libswscale:用于视频场景比例缩放、色彩映射转换;
  • libpostproc:用于后期效果处理;
  • ffmpeg:该项目提供的一个工具,可用于格式转换、解码或电视卡即时编码等;
  • ffsever:一个 HTTP 多媒体即时广播串流服务器;
  • ffplay:是一个简单的播放器,使用ffmpeg 库解析和解码,通过SDL显示;

ffmpeg 安装

# centos linux下安装ffmpeg

# 1、下载解压
wget http://www.ffmpeg.org/releases/ffmpeg-3.1.tar.gz
tar -zxvf ffmpeg-3.1.tar.gz 

# 2、进入解压后目录,输入如下命令/usr/local/ffmpeg为自己指定的安装目录
cd ffmpeg-3.1
./configure --prefix=/usr/local/ffmpeg
make && make install

# 3、配置变量
vi /etc/profile
在最后PATH添加环境变量:
export PATH=$PATH:/usr/local/ffmpeg/bin
保存退出
查看是否生效
source /ect/profile  设置生效

或者直接在环境变量后加入ffmpeg启动路径
export PATH=$PATH:/usr/local/ffmpeg/bin

# 4、查看版本
ffmpeg -version

如果安装过程中出现以下错误:

yasm/nasm not found or too old. Use –disable-yasm for a crippled build.
 If you think configure made a mistake, make sure you are using the latest
 version from Git. If the latest version fails, report the problem to the
 [email protected] mailing list or IRC #ffmpeg on irc.freenode.net.
 Include the log file “config.log” produced by configure as this will help
 solve the problem.

# 安装yasm
wget http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz
tar -zxvf yasm-1.3.0.tar.gz
cd yasm-1.3.0
./configure
make && make install

常用ffmpeg命令

直播相关

RTMP推流

ffmpeg -re -i https://xxxx.mp4 -vcodec libx264 -preset ultrafast -acodec libmp3lame -f flv rtmp://xxxxxx

多进程推流

多路推流

视频相关

ffmpeg -i input.avi output.mp4

从视频中提取音频

ffmpeg -i input.mp4 -acodec aac -vn output.aac

只保留视频而不保留音频

ffmpeg -i input.mp4 -vcodec copy -an output.mp4

视频裁剪

扫描二维码关注公众号,回复: 15814786 查看本文章
# 从时间为00:00:15开始,截取5秒钟的视频
ffmpeg -ss 00:00:15 -t 00:00:05 -i input.mp4 -vcodec copy -acodec copy output.mp4

添加字幕

# mp4添加软字幕
ffmpeg -i infile.mp4 -i infile.srt -c copy -c:s mov_text outfile.mp4
# mkv添加软字幕
ffmpeg -i input.mkv -i subtitles.srt -c copy output.mkv
# 硬字幕
ffmpeg -i end_font.mp4 -vf subtitles=words.srt -y output.mp4

码率控制

# 将码率将为2Mbps
ffmpeg -i input.mp4 -b:v 2000k output.mp4

# 设置为码率在2Mpbs波动
ffmpeg -i input.mp4 -b:v 2000k -bufsize 2000k output.mp4
-minrate最小码率,-maxrate最大码率

# 码率最大不超过2500k
ffmpeg -i input.mp4 -b:v 2000k -bufsize 2000k -maxrate 2500k output.mp4

ffmpeg官方wiki比较建议,设置b:v时,同时加上 -bufsize,用于设置码率控制缓冲器的大小,设置的好处是,让整体的码率更趋近于希望的值,减少波动。

编码转换

# 比如一个视频的编码是MPEG4,转换为H264编码

ffmpeg -i input.mp4 -vcodec h264 output.mp4

修改分辨率

# 将输入的1920x1080缩小到960x540输出

ffmpeg -i input.mp4 -vf scale=960:540 output.mp4

添加图片

# 将图片添加到视频中,默认在左上角
ffmpeg -i input.mp4 -i logo.png -filter_complex overlay output.mp4
# 右上角
ffmpeg -i input.mp4 -i logo.png -filter_complex overlay=W-w output.mp4
# 左下角
ffmpeg -i input.mp4 -i logo.png -filter_complex overlay=0:H-h output.mp4
# 右下角
ffmpeg -i input.mp4 -i logo.png -filter_complex overlay=W-w:H-h output.mp4

局部打码

# 可用于一些网站logo打码
# 语法:-vf delogo=x:y:w:h[:t[:show]]
ffmpeg -i input.mp4 -vf delogo=0:0:220:90:100:1 output.mp4

截取画面

# r表示每一秒几帧,-q:v表示存储jpeg的图像质量,一般2是高质量。
ffmpeg -i input.mp4 -r 1 -q:v 2 -f image2 pic-%03d.jpeg
​
如此,ffmpeg会把input.mp4,每隔一秒,存一张图片下来。
​
# -ss表示开始时间,-t表示共要多少时间
ffmpeg -i input.mp4 -ss 00:00:20 -t 10 -r 1 -q:v 2 -f image2 pic-%03d.jpeg
​
如此,ffmpeg会从input.mp4的第20s时间开始,往下10s,即20~30s这10秒钟之间,每隔1s就抓一帧,总共会抓10帧。

视频拼接

ffmpeg -i "concat:input1.mpg|input2.mpg|input3.mpg" -c copy output.mpg

音频相关

格式转换

ffmpeg -i input.mp2 output.wav
# 转换过程中也可以指定其他参数
ffmpeg -i null.ape -ar 44100 -ac 2 -ab 16k -vol 50 -f mp3 null.mp3

-i代表输入参数
-acodec aac(音频编码用AAC) 
-ar 设置音频采样频率
-ac  设置音频通道数
-ab 设定声音比特率
-vol <百分比> 设定音量

音频合成

# 直接拼接
ffmpeg -i "concat:input1.mp3|input2.mp3|input3.mp3" -c copy output.mp3
# 或者混合在一起
ffmpeg -i INPUT1 -i INPUT2 -i INPUT3 -filter_complex amix=inputs=3:duration=first:dropout_transition=3 OUTPUT

# 音视频合成
# 如果音频比视频长,就会停在最后一帧继续播放音频

ffmpeg -i a.wav  -i a.avi out.avi

截取音频

ffmpeg64.exe -i 124.mp3 -vn -acodec copy -ss 00:00:00 -t 00:01:32 output.mp3

录制命令

录制屏幕

# 录制屏幕,输出到d:/out.mp4
ffmpeg -f gdigrab -i desktop -f mp4 d:/out.mp4
# -r设置帧率
此命令用于录制视频,无法录制声音,按q退出

录制音频

# 录制麦克风
ffmpeg -f dshow -i audio="麦克风 (Realtek High Definition Audio)" -acodec libmp3lame audio.mp3
# 录制系统声音,立体声看不见可能是被禁用了
ffmpeg -f dshow -i audio="立体声混音 (Realtek High Definition Audio)" -acodec libmp3lame audio.mp3
# 录制屏幕和系统声音
ffmpeg -f dshow -i audio="立体声混音 (Realtek High Definition Audio)" -f gdigrab -i desktop -f mp4 d:/out.mp4
# 录制屏幕和麦克风
ffmpeg -f dshow -i audio="麦克风 (Realtek High Definition Audio)" -f gdigrab -i desktop -f mp4 d:/out.mp4

Electron中使用ffmpeg

# 需要以下4个包
# @ffprobe-installer/ffprobe
# @ffmpeg-installer/ffmpeg
# fluent-ffmpeg
# ffmpeg

const ffprobePath = require('@ffprobe-installer/ffprobe');
const ffmpegPath = require('@ffmpeg-installer/ffmpeg');
const FfmpegCommand = require('fluent-ffmpeg');

// asar打包后路径有所变化,不然Electron打包后会出现错误
if (process.env.NODE_ENV === 'production') {
  FfmpegCommand.setFfmpegPath(ffmpegPath.path.replace('app.asar', 'app.asar.unpacked'))
  FfmpegCommand.setFfprobePath(ffprobePath.path.replace('app.asar', 'app.asar.unpacked'))
} else {
  FfmpegCommand.setFfmpegPath(ffmpegPath.path)
  FfmpegCommand.setFfprobePath(ffprobePath.path)
}

const ffmpeg = new FfmpegCommand();

之后按照如下文档就可以操作ffmpeg了 node-fluent-ffmpeg 文档

Node中使用ffmpeg

# 需要以下3个包
# @ffmpeg-installer/ffmpeg
# fluent-ffmpeg
# ffmpeg

const ffmpegPath = require('@ffmpeg-installer/ffmpeg');
const FfmpegCommand = require('fluent-ffmpeg');
FfmpegCommand.setFfmpegPath(ffmpegPath.path);

const ffmpeg = new FfmpegCommand();

之后按照如下文档就可以操作ffmpeg了 node-fluent-ffmpeg 文档

浏览器中使用ffmpeg

支持音视频转换合成,不支持直播推流

ffmpeg-fs 文档

注意:可以看到ffmpeg-wasm 只有几个可用的api,目前的功能只能支持视频,音频的转换。并不能支持用 ffmpeg-wasm 进行直播推流。 ffmpeg-wasm 只能做些简单的音视频合成,不能进行推流

当然要在浏览器中做直播推流也不是没有办法:

  1. 使用falsh插件可以直接推送 rtmp 流,目前chrome已经不支持falsh运行了,高版本的chrome都已经无从开启。可以参考此文在浏览器中实现rtmp推流
  2. 使用webrtc做视频直播,但是服务器要做相应的支持。

SharedArrayBuffer 不存在

临时启用

open /Applications/Chromium.app --args --enable-features=SharedArrayBuffer

如何设置跨域隔离启用 SharedArrayBuffer

Assertion failed: Cannot call unknown function proxy_main, make sure it is exported

浏览器中使用 ffmpeg-wasm 需要设置Cross-Origin-Opener-PolicyCross-Origin-Embedder-Policyheaders。扩展程序也必须设置它们才能使用 WASM。

// 设置正确的 Cross Origin Header 
// 以 Nodejs 为例
res.setHeader("Cross-Origin-Opener-Policy", "same-origin");
res.setHeader("Cross-Origin-Embedder-Policy", "require-corp");

之后按照如下文档就可以操作ffmpeg了 ffmpeg-wasm

使用 WASM 和 FFmpeg 的 GIF(理智)播放控制

常常会碰到一些问题

读取丢包,调控品质的参数需要多加练习。

练习每个参数输入后对视频/音频的变化到底是什么样子的。

原文 FFmpeg 开发详细入门 - 掘金

★文末名片可以免费领取音视频开发学习资料,内容包括(FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)以及音视频学习路线图等等。

见下方!↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

猜你喜欢

转载自blog.csdn.net/yinshipin007/article/details/131860379