Litao OK Blog

A little blog for my life.

Ffmpeg编码示例

1. 使用指定音频替代原视频音频部分

1
ffmpeg -i A.mp4 -i B.m4v -vcodec copy -acodec copy -map 0:v:0 -map 1:a:0 -y OUT.mp4

2. 多个视频合并

首先,建立一个文本文件list.txt,里面放带合并视频文件名列表,要求所有视频编码相同,例如:

1
2
3
file A.mp4
file B.mp4
file C.mp4

然后使用下面方法合并:

1
ffmpeg -f concat -i list.txt -c copy OUT.mp4

3. 将源视频编码为H.264 high profile

1) 如果追求更高质量,可以使用两个pass进行编码,不过耗时会长一些:

pass1 :

1
ffmpeg -i A.avi -vcodec h264 -vprofile high -preset slow -b:v 1500k -maxrate 2000k -bufsize 2000k -vf scale='-1:720' -aspect '16:9' -threads 0 -pass 1 -an -f mp4 /dev/null

pass2 :

1
ffmpeg -i A.avi -vcodec h264 -vprofile high -preset slow -b:v 1500k -maxrate 2000k -bufsize 2000k -vf scale='-1:720' -aspect '16:9' -threads 0 -pass 2 -acodec libfaac -b:a 128k -f mp4 OUT.mp4

2) 如果要求编码节省时间,可以只执行一个pass:

1
ffmpeg -i A.avi -vcodec libx264 -vprofile high -preset slow -b:v 1500k -maxrate 2000k -bufsize 2000k -vf scale='-1:720' -aspect '16:9' -threads 0 -acodec libfaac -b:a 128k -f mp4 OUT.mp4

另外,需要注意以上编码中,-b:v后面的码率,-maxrate的码率是要根据源视频进行调整,如果源视频只有800k,那这里肯定不能设置超过800k,另外,scale是编码后的分辨率,本例中是要转成720p尺寸,如果源视频非标准16:9或保持源视频尺寸和比例,则可以去掉参数-vf scale和-aspect 编码类型是要使用ffmpeg -formats来查看你装的ffmpeg版本和库名来确定的,比如有的版本中H.264编码名称为 libx264

4. 按照时间节点截取视频

下面是截取A视频的1分20秒开始,持续30秒的片段,保存为B视频。

1
ffmpeg -i A.mp4 -ss 00:01:20 -t 30 -vcodec copy -acodec copy B.mp4

5. 给视频添加ass字幕

mp4文件:

1
ffmpeg -i video.mp4 -vf "ass=subtitle.ass" out.mp4

mkv文件:

1
ffmpeg -i input.mp4 -i input.ass -c:v copy -c:a copy -c:s copy -map 0:0 -map 0:1 -map 1:0 -y out.mkv

wmv文件:

1
ffmpeg -i input.wmv -i input.ass -c:v copy -c:a copy -c:s copy -map 0:0 -map 0:1 -map 1:0 -y out.mkv