本文整理一些常用的ffmpeg的命令。
ffmpeg安装
mac下ffmpeg的安装
brew tap homebrew-ffmpeg/ffmpeg
brew install homebrew-ffmpeg/ffmpeg/ffmpeg --with-openssl
ffmpeg命令格式
语法
ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...
参数说明
主要参数:
-i
设定输入流-f
设定输出格式-ss
开始时间-c
指定编解码器
视频参数:
-b
设定视频的音视频码率(-b:v
和-b:a
),默认为200Kbit/s-r
设定帧速率,默认为25-s
设定分辨率,即画面的宽与高-aspect
设定画面的比例-vn
不处理视频-vcodec
设定视频编解码器,未设定时则使用与输入流相同的编解码器-ss
开始时间-t
持续时间-bf
B帧数目控制,-g
关键帧间隔控制
音频参数:
-ar
设定采样率-ac
设定声音的Channel数-acodec
设定声音编解码器,未设定时则使用与输入流相同的编解码器-an
不处理音频
ffmpeg命令例子
分离视频音频流
// 分离视频流
ffmpeg -i input_file -vcodec copy -an output_file_video
// 分离音频流
ffmpeg -i input_file -acodec copy -vn output_file_audio
// mp4转aac
ffmpeg -i filename.mp4 -acodec copy -vn filename.aac
// mp4转mp3
ffmpeg -i filename.mp4 filename.mp3
视频解复用
ffmpeg –i test.mp4 –vcodec copy –an –f h264 test.264
ffmpeg –i test.avi –vcodec copy –an –f h264 test.264
视频转码
// 转码为码流原始文件
ffmpeg –i test.mp4 –vcodec h264 –s 352*278 –an –f h264 test.264
// 转码为码流原始文件
ffmpeg –i test.mp4 –vcodec h264 –bf 0 –g 25 –s 352*278 –an –f h264 test.264
// 转码为封装文件
ffmpeg –i test.avi -vcodec mpeg4 –vtag xvid –qsame test_xvid.avi
// m3u8转mp4
ffmpeg -i "http://xxx.m3u8" -c copy -bsf:a aac_adtstoasc xxx.mp4
// 更改mp4视频分辨率
ffmpeg -i xxx.mp4 -acodec copy -bsf:a aac_adtstoasc -vcodec mpeg4 -s 1280x720 xxx_720p.mp4
压缩视频码率
ffmpeg -i in.mp4 -acodec copy -vcodec h264 -b:v 2500k out.mp4
视频封装
ffmpeg –i video_file.h264 –i audio_file.aac output.mp4
视频剪切
// 提取图片
ffmpeg –i test.avi –r 1 –f image2 image-%3d.jpeg
// 剪切视频
ffmpeg -ss 0:1:30 -t 0:0:20 -i input.avi -vcodec copy -acodec copy output.avi
YUV序列转AVI
ffmpeg –s w*h –pix_fmt yuv420p –i input.yuv –vcodec mpeg4 output.avi
本地视频推流
ffmpeg -re -i ~/video.mp4 -vcodec libx264 -acodec aac -f flv rtmp://localhost:1935/rtmplive/home
// 视频循环推流
ffmpeg -stream_loop -1 -re -i video.mp4 -c copy -f flv "rtmp://xxx"
// 添加文字滤镜
ffmpeg -re -i ~/video_4.mp4 -vf drawtext="fontfile=/Users/xxx/fonts/Kaiti.ttf: text='Test hello 哈哈': x=100: y=50: fontsize=24: fontcolor=green" -vcodec libx264 -acodec aac -f flv rtmp://xxx
// 本地图片推流,-t可以指定多少秒
ffmpeg -loop 1 -i image.png -c:v libx264 -t 15 -pix_fmt yuv420p -vf scale=1280:720 -f flv rtmp://xxx
分离视频像素层
ffmpeg -i video.mp4 -c:v rawvideo -pix_fmt yuv420p out.yuv
使用mp4循环推流的脚本
#!/bin/bash
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
root_dir=$(cd "$(dirname "$0")"; pwd)
cd $root_dir
rm -f list.txt
echo "dir: `pwd`"
rtmp_url="rtmp://xxx"
if [ "$1"x != x ]; then
rtmp_url=$1
fi
for i in {1..1000}
do
printf "file '%s'\n" input.mp4 >> list.txt;
done
# Restart
NAME=push-task
PIDFILE=$root_dir/$NAME.pid
COMMAND="/usr/local/bin/ffmpeg -- -f concat -re -i $root_dir/list.txt -c copy -f flv $rtmp_url"
echo "command: $COMMAND"
do_start() {
echo "start task"
start-stop-daemon --start --quiet --background --make-pidfile --pidfile $PIDFILE --exec $COMMAND
}
do_stop() {
if [ -e $PIDFILE ]
echo "stop task"
start-stop-daemon --stop --quiet --pidfile $PIDFILE
then rm $PIDFILE
fi
}
do_stop
sleep 1
do_start
exit 0
光盘aiff文件批量转mp3
#!/bin/bash
for file in ./*.aiff
do
if test -f "${file}"
then
echo "$file"
name=$( echo "${file}" | awk '{print $1}' | awk -F "/" '{print $2}' )
format_name=$(printf "CD1-%02s.mp3" "${name}")
echo "$format_name"
ffmpeg -i "$file" "$format_name"
fi
done
ts文件拼接
#!/bin/bash
for i in {10..100}
do
url="https://live.cdn.com/live/uuid/10000$i.ts"
curl -O "$url"
bin=`cat 10000$i.ts >> all.ts`
done
ffmpeg -i all.ts -c copy all.mp4
视频旋转
比如逆时针旋转180度:
ffmpeg -i 1.mp4 -b:v 1660K -vf "transpose=2,transpose=2" 2.mp4
其中transpose取值:
0 = 90CounterCLockwise and Vertical Flip (default)
1 = 90Clockwise
2 = 90CounterClockwise
3 = 90Clockwise and Vertical Flip
使用视频滤镜
比如,把视频的一块150x24的内容覆盖到另一个位置:
ffmpeg -i old.mp4 -vf "split [main][tmp]; [tmp] crop=150:24:418:377 [over]; [main][over] overlay=418:353 [out]" -acodec copy new.mp4
ffplay命令
播放yuv裸数据
ffplay -video_size 1280x720 media.yuv
ffprobe命令
查看格式信息
ffprobe -show_format pm.mp4
输出流的具体信息
ffprobe -print_format json -show_streams pm.mp4
查看关键帧间隔
ffprobe -v quiet -show_frames 123.mp4 | grep "pict_type="
ffmpeg库内容
FFmpeg是一套集录制、转换、音视频编码解码、流化等众多功能为一体的完整开源解决方案。框架中包含各种工具,每一个用于完成特定的功能。
开发库
libavformat
是一个各种音视频封装格式的分离器(demuxer、解析)和混流器(muxer、组装)的库。
libavformat用来解析视频文件封装格式,并将包含在其中的原始音频视频流分离出来,再交给libavcodec解码。
libavcodec
是一个音频/视频解码器和编码器的库。该库实现了市面上可见的绝大部分解码器的功能,被其他各大解码器ffdshow,Mplayer等所包含或应用。
libavfilter
是一个音视频滤镜(也有称过滤器或滤波器)库。用于实现声音图像的各种特效,如宽高比、裁剪、格式化、非格式化、伸缩、水印等等。
libavutil
是一个包含公共工具函数的使用库。目的是简化编程功能,其中包括随机数生成器,数据结构,算数运算,字符操作,CRC校验码的产生,128位整数数学,最大公约数,整数开方,整数取对数,内存分配,大端小端格式的转换,核心多媒体工具等东西。
libavresample
音视频封转编解码格式预设等。
libswscale
是一个原始视频格式转码的库。也就是执行高度优化的图像缩放和颜色空间/像素格式转换操作的库,比如视频场景比例缩放、色彩映射转换,图像颜色空间或格式转换,如 rgb565、rgb888等与yuv420等之间转换。
libswresample
是一个原始音频格式转码的库。比如,执行高度优化的音频重采样,重新矩阵和取样格式转换操作等。
libpostproc
是一个音视频后期效果处理的库。如图像去块效应、同步、时间计算的简单算法等等。
命令工具
- ffmpeg:是一个命令行接口的,可用于解码、编码、转码、混流、分离、转化为流、过滤等等众多功能的库。Fmpeg是框架,而ffmpeg是一个其中的一个功能模块。
- ffsever:是一个HTTP多媒体即时广播串流服务器。能够将多媒体文件转化为用于实时广播的流。
- ffplay:是一个简单的使用ffmpeg库解析和解码、通过SDL显示的简易播放器。
- ffprobe:是一个多媒体流的分析器。
参考
- https://ffmpeg.org/ffmpeg.html
- https://trac.ffmpeg.org/wiki/Concatenate
- https://github.com/tonydeng/fmj/blob/master/ffmpeg.md
- http://blog.csdn.net/samantha_sun/article/details/4729188
- http://www.jianshu.com/p/d541b317f71c
- http://www.cnblogs.com/dwdxdy/p/3240167.html
- http://hxzqlh.com/2016/01/07/ffmpeg-%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/
- https://blog.csdn.net/JemyCheung/article/details/88413000