本文整理一些常用的ffmpeg的命令。

ffmpeg命令格式

语法

ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...

参数说明

主要参数:

视频参数:

音频参数:

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 

ffmpeg库内容

FFmpeg是一套集录制、转换、音视频编码解码、流化等众多功能为一体的完整开源解决方案。框架中包含各种工具,每一个用于完成特定的功能。

开发库

libavformat

是一个各种音视频封装格式的分离器(demuxer、解析)和混流器(muxer、组装)的库。

libavformat用来解析视频文件封装格式,并将包含在其中的原始音频视频流分离出来,再交给libavcodec解码。

libavcodec

是一个音频/视频解码器和编码器的库。该库实现了市面上可见的绝大部分解码器的功能,被其他各大解码器ffdshow,Mplayer等所包含或应用。

libavfilter

是一个音视频滤镜(也有称过滤器或滤波器)库。用于实现声音图像的各种特效,如宽高比、裁剪、格式化、非格式化、伸缩、水印等等。

libavutil

是一个包含公共工具函数的使用库。目的是简化编程功能,其中包括随机数生成器,数据结构,算数运算,字符操作,CRC校验码的产生,128位整数数学,最大公约数,整数开方,整数取对数,内存分配,大端小端格式的转换,核心多媒体工具等东西。

libavresample

音视频封转编解码格式预设等。

libswscale

是一个原始视频格式转码的库。也就是执行高度优化的图像缩放和颜色空间/像素格式转换操作的库,比如视频场景比例缩放、色彩映射转换,图像颜色空间或格式转换,如 rgb565、rgb888等与yuv420等之间转换。

libswresample

是一个原始音频格式转码的库。比如,执行高度优化的音频重采样,重新矩阵和取样格式转换操作等。

libpostproc

是一个音视频后期效果处理的库。如图像去块效应、同步、时间计算的简单算法等等。

命令工具

参考