FFmpeg命令行操作

417 阅读4分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第7天,点击查看活动详情 >>

FFmpeg处理音视频流程

image.png

FFmpeg工具

ffmpeg:多媒体文件之间转换格式。
ffplay:一个基于SDL与FFmpeg的简单媒体播放器,可播放各类格式多媒体文件(mp4,h.264,yuv等)。

FFmpeg目录及作用

libavcodec:包含音频/视频编解码器的解码器和编码器
libavformat:包含多媒体容器格式的解复用器和复用器
libavtuil:包含简化程序功能的库,其中包括随机数生成器,数据结构,数学例程,核心多媒体实用程序等
libavfilter:各种音视频过滤器
libavdevice:访问捕获设备和回放设备接口,用于从许多常见的多媒体输入/输出软件框架(包括Video4Linux,Video4Linux2,VfW和ALSA)中获取和呈现
libswresample:混音和重采样
libswscale:色彩转换和缩放工具

FFmpeg命令

可分为以下大类:

  • 基本信息查询
  • 录制
  • 分解/复用
  • 处理原始数据
  • 滤镜
  • 切割与合并
  • 图/视互转
  • 直播相关

基本信息查询

录制命令

录制屏幕命令
ffmpeg -f x11grab -s 640x480 -i :0.0 -r 30 out.yuv
参数说明
-f 使用设备
-s 视频的宽高
-i 输入流
-r 帧率 每秒三十帧
播放录制文件命令
ffplay -video_size 640x480 -pix_fmt bgr0 out.yuv
参数说明
-video_size 640*480,yuv文件没有视频宽高等信息,需指定视频宽高
-pix_fmt 以像素格式渲染,这里需要指定录制时的像素格式,否则会花屏


使用摄像头录制命令
ffmpeg -f video4linux2 -s  640x480 -pixel_format yuyv422  -i /dev/video0  out.mp4
参数说明补充
-pixel_format 像素格式
播放命令
ffplay out.mp4

分解、复用

1.视频转码相关 (未全部尝试 仅尝试几条在Ubuntu系统中都可以
ffmpeg -i test.ts -acodec copy -vcodec copy -f mp4 output.mp4//ts视频流转mp4
ffmpeg -i test.h264 -vcodec copy -f mpegts output.ts//h264视频转ts视频流
ffmpeg -i test.h264 -vcodec copy -f mp4 output.mp4//h264视频转mp4
ffmpeg -i test.mp4 -b:v 640k output.flv //mp4转flv
ffmpeg -i test.mp4 -acodec copy -vcodec copy -f flv output.flv //mp4转flv
ffmpeg -i test.flv -b:v 640k output.mp4 //flv转mp4
ffmpeg -i test.mp4 -s 176x144 -vcodec h263 -r 25 -b 12200 -ab 12200 -ac 1 -ar 8000 output.3gp //mp4转3gp
ffmpeg -i test.avi -s aqif -vcodec -acodec mp3 -ac 1 -ar 8000 -r 25 -ab 32 -y output.3gp //avi转3gp
ffmpeg -i test.3gp -f avi -vcodec xvid -acodec mp3 -ar 22050 output.avi //3gp转flv
ffmpeg -i test.flv -s 176x144 -vcodec h263 -r 25 -b 200 -ab 64 -acodec mp3 -ac 1 -ar 8000 output.3gp //flv转3gp
ffmpeg -i test.mp4 output.avi //mp4转avi
ffmpeg -i test.flv -vcodec h264 -r 25 -b 200 -ab 128 -acodec mp3 -ac 2 -ar 44100 output.mp4 //flv转mp4
ffmpeg -i test.mp4 -c:v libx264 -ar 22050 -crf 28 output.flv //mp4转flv
ffmpeg -i test.avi -c copy -map 0 output.mp4 //avi转mp4
ffmpeg -i  http://vfile1.grtn.cn/2018/1542/0254/3368/154202543368.ssm/154202543368.m3u8 -c copy -bsf:a aac_adtstoasc -movflags +faststart test.mp4 //m3u8转mp4
ffmpeg -i test.mkv -y -vcodec copy -acodec copy output.mp4 //mkv转mp4
ffmpeg -i test.mkv -vcodec copy -acodec copy output.avi  //mkv转avi
参数说明:
-vcodec copy:vcodec指定视频编码器,copy 指明只拷贝,不做编解码
-acodec copy:acodec指定音频编码器,copy 指明只拷贝,不做编解码

2、抽取视频
ffmpeg -i input.mp4 -vcodec copy -an out.h264
参数说明:
-an:a 代表音频,n 代表 no 也就是没有音频的意思

3、抽取音频
ffmpeg -i input.mp4 -acodec copy -vn out.aac
参数说明:
-vn:v 代表视频,n 代表 no 也就是没有视频的意思

处理原始数据

通过音视频设备采集,没有经过任何加工的数据叫原始数据,视频原始数据为YUV格式,音频原始数据为PCM格式。FFmpeg可以从封装格式数据中抽取出YUV和PCM格式的原始数据,并对原始数据进行格式转换等处理。

提取yuv
ffmpeg -i out.mp4 -an -c:v rawvideo -pix_fmt yuv420p out.yuv
-c:v 指对视频格式进行编码,编码格式是rawvideo
播放
ffplay -s 320x240 -pix_fmt yuv420p out.yuv
提取pcm
ffmpeg -i input.mp4 -vn -ar 44100 -ac 2 -f s16le out.pcm

滤镜

截取视频大小
ffmpeg -i out.mp4 -vf crop=in_w-200:in_h-200 -c:v libx264 outlit.mp4
-vf代表视频滤镜
crop 滤镜的名字
in_w-200 宽度减200
in_h-200 高度减200
-c:v:使用的视频编码器
注意:libx264 没有的需要安装 安装好后需要重新编译ffmpeg及配置环境变量

更多滤镜去官网查找

切割与合并

截取 -ss从什么时间开始截取 -t截取多久
ffmpeg -i out.mp4 -ss 00:00:00 -t 0.1 out.ts
合并 需要新建一个文件
ffmpeg -f concat -i inputs.txt out.flv

图/视互转

视频抽成图片
ffmpeg -i in.flv -r 1 -f image2 image-%3d.jpeg
图片转视频
ffmpeg -i image-%3d.jpeg out3.mp4
-r 1 表示一秒抽一帧

直播

推流
ffmpeg -re -i out.mp4 -c copy -f flv rtmp://server/live/StreamName
-c音视频
-v视频
-a音频
拉流
ffmpeg -i rtmp://server/live/StreamName -c copy dump.flv