【音视频进阶开发指南笔记-5】FFmpeg命令行工具的使用
目录
- 1. ffprobe-查看音视频文件的信息
- 2. ffplay-播放音视频文件
- 3. ffmpeg
- 3.1 支持的格式,-formats
- 3.2 剪切视频
- 3.3 分成两个视频,一个30s
- 3.4 提取音视频文件中的音频
- 3.5 提取音视频文件中的视频
- 3.6 bsf,mp4中导出裸H264数据(annexb格式)
- 3.7 合并音频和视频流
- 3.8 wav转aac
- 3.9 wav转pcm
- 3.10 flv复制音频流转成MP4格式
- 3.11 mp4转为gif
- 3.12 每4秒取1帧照片
- 3.13 图片组成gif
- 3.16 音量效果器,调低音量,-af "volume=0.5"
- 3.17 音量的淡入效果,-filter_complex afade=t=in:ss=0:d=5
- 3.18 音量的淡出效果,-filter_complex afade=t=out:ss=200:d=5
- 3.19 两首歌合并,amix=inputs=2:duration=shortest
- 3.20 声音变速但不变调,-filter_complex atempo=0.5
- 3.21 为视频增加水印,-filter_complex 'overlay=main_w-overlay_w-10:10'
- 3.22 视频提亮效果器,-vf eq=brightness=0.25
- 3.23 视频增加对比度,-vf eq=contrast=1.5
- 3.24 视频旋转效果,-vf "transpose=1"
- 3.25 视频裁剪效果
- 3.26 rgb转jpeg格式的图片,-vcodec mjpeg
- 3.27 YUV视频转为png/jpeg格式的图片,-vcodec png
- 3.28 两个音频文件两路流封装到一个文件中
1. ffprobe-查看音视频文件的信息
国粤双语的视频会有两条Audio流
1.1 查看音频信息
ffprobe ff.mp3
1.2 显示format信息,-show_format
ffprobe -show_format vedio/MP4/SampleVideo_1280x720_10mb.mp4
1.3 以json的形式来show stream里面的内容,-print_format json -show_streams
ffprobe -print_format json -show_streams SampleVideo_1280x720_10mb.mp4
1.4 显示每一帧的信息,-show_frames
ffprobe -show_frames vedio/MP4/SampleVideo_1280x720_10mb.mp4
1.5 显示packets的信息,-show_packets
ffprobe -show_packets vedio/MP4/SampleVideo_1280x720_10mb.mp4
2. ffplay-播放音视频文件
播放器是以FFmpeg为基础 + 渲染音视频的库libSDL来构成的
2.1 播放mp3或者mp4文件
ffplay audio/MP3/yehaizi.mp3/mp4
2.2 循环播放3次,-loop 3
ffplay audio/MP3/yehaizi.mp3 -loop 3
2.3 指定视频的音频流为1,一个视频中可以有多个音频流,-ast 1
ffplay vedio/MKV/SampleVideo_1280x720_10mb.mkv -ast 1
2.4 指定播放视频中的视频流为2,一个视频中可以有多个视频流,-vst 1
ffplay vedio/MKV/SampleVideo_1280x720_10mb.mkv -vst 1
2.5 播放pcm时需要指定参数,-f为格式,声道,采样率
ffplay audio/PCM/yehaizi.pcm -f s16le -channels 2 -ar 44100
s16le:signed 16 bits little endian
2.6 mp4 -> YUV -> 提取每一帧YUV -> 播放一帧YUV
2.6.1 从原视频的第10s开始,剪切出3s
ffmpeg -i SampleVideo_1280x720_10mb.mp4 -ss 00:00:10.0 -codec copy -t 3 frame/SampleVideo_1280x720_10mb_3s.mp4
2.6.2 将3s的mp4视频转换成YUV格式的
ffmpeg -i SampleVideo_1280x720_10mb_3s.mp4 -pix_fmt yuv420p YUV/SampleVideo_1280x720_10mb_3s.yuv
2.6.3 从3s 25fps的yuv视频中,提取每帧yuv
fmpeg -f rawvideo -framerate 25 -s 1280x720 -pixel_format yuv420p -i SampleVideo_1280x720_10mb_3s.yuv -c copy -f segment -segment_time 0.01 frames%d.yuv
一帧yuv大小的算法:1280*720*1(Y占一个字节) + 1280*720*0.5(UV占0.5字节),大概就是1.3M
2.6.4 播放一帧yuv
ffplay -f rawvideo -pixel_format yuv420p -s 1280*720 frames0.yuv
2.7 将yuv转换成rgb,并显示出来
2.7.1 将yuv转为rgb
ffmpeg -s 1280*720 -pix_fmt yuv420p -i frames0.yuv -pix_fmt rgb24 frames0.rgb
2.7.2 将rgb显示出来
ffplay -f rawvideo -pixel_format rgb24 -s 1280*720 frames0.rgb
一帧rgb24大小的算法:1280*720*3,大概就是2.7M左右
2.8 同步,-sync audio/video/ext
3. ffmpeg
3.1 支持的格式,-formats
ffmpeg -formats
3.2 剪切视频
ffmpeg -i SampleVideo_1280x720_10mb.mp4 -ss 00:00:10.0 -codec copy -t 5 frame/SampleVideo_1280x720_10mb_5s.mp4
3.3 分成两个视频,一个30s
ffmpeg -i SampleVideo_1280x720_10mb.mp4 -t 30 -c copy SampleVideo_1280x720_10mb_0_30.mp4 -ss 00:00:30 -codec copy SampleVideo_1280x720_10mb_30_end.mp4
3.4 提取音视频文件中的音频
ffmpeg -i SampleVideo_1280x720_10mb.mp4 -vn -acodec copy test/audio_only.m4a
mp4文件里面的音频叫做m4a,MPEG-4 AAC,m4a是封装文件,而AAC是编码文件
3.5 提取音视频文件中的视频
ffmpeg -i SampleVideo_1280x720_10mb.mp4 -an -vcodec copy test/video_only.mp4
3.6 bsf,mp4中导出裸H264数据(annexb格式)
H264封装格式
1. 一种是annexb模式,传统模式,有startcode(0x000001或0x0000001)分割NALU,在mpegts流媒体中使用,vlc里打开编码器信息中显示h264;
2. 一种是AVCC模式,一般用mp4、mkv、flv容器封装,以长度信息分割NALU, vlc里打开编码器信息中显示avc1。
很多场景需要进行这两种格式之间的转换(对封装格式进行转换),FFmpeg提供了名称为h264_mp4toannexb的Bitstream Filter(bsf)来实现这个功能。Bitstream Filter对已编码的码流进行操作,不涉及解码过程。
ffmpeg -i SampleVideo_1280x720_10mb.mp4 -an -vcodec copy -bsf:v h264_mp4toannexb test/annextb.h264
3.7 合并音频和视频流
ffmpeg -i test/audio_only.m4a -i test/video_only.mp4 -acodec copy -vcodec copy test/merge.mp4
3.8 wav转aac
ffmpeg -i yong.wav -acodec libfdk_aac test/yong.aac
3.9 wav转pcm
ffmpeg -i shaonvdeqidao.wav -acodec pcm_s16le -f s16le test/shaonvdeqidao.pcm
3.10 flv复制音频流转成MP4格式
ffmpeg -i SampleVideo_1280x720_10mb.flv -vcodec libx264 -acodec copy test/flvtomp4_sameaudio.mp4
3.11 mp4转为gif
分辨比例不变,宽度改为100,5s,帧率为10:
ffmpeg -i SampleVideo_1280x720_10mb.mp4 -vf scale=100:-1 -t 5 -r 10 test/mp4togif_10_5s.gif
3.12 每4秒取1帧照片
ffmpeg -i SampleVideo_1280x720_10mb.mp4 -r 0.25 test/frames_%4d.png
3.13 图片组成gif
ffmpeg -i frames_%04d.png -r 5 yuvtogif.gif
帧率为5,必须是照片格式的才可以,yuv格式的不行
3.16 音量效果器,调低音量,-af "volume=0.5"
ffmpeg -i yehaizi.wav -af "volume=0.5" test/volume_0_5_yehaizi.wav
3.17 音量的淡入效果,-filter_complex afade=t=in:ss=0:d=5
ffmpeg -i yehaizi.wav -filter_complex afade=t=in:ss=0:d=5 test/danru_yehaizi.wav
ss表示开始的地方,从0开始;d表示时间段,持续5秒钟
使用Audacity软件可以看到,前面调小声,后面慢慢变大
3.18 音量的淡出效果,-filter_complex afade=t=out:ss=200:d=5
ffmpeg -i yehaizi.wav -filter_complex afade=t=out:ss=200:d=5 test/danru_yehaizi.wav
后面的声音变小,直到没有了
3.19 两首歌合并,amix=inputs=2:duration=shortest
ffmpeg -i yong.wav -i yehaizi.wav -filter_complex amix=inputs=2:duration=shortest test/mix_yong_yehaizi.wav
3.20 声音变速但不变调,-filter_complex atempo=0.5
ffmpeg -i yong.wav -filter_complex atempo=0.5 test/yong_0_5.wav
3.21 为视频增加水印,-filter_complex 'overlay=main_w-overlay_w-10:10'
ffmpeg -i SampleVideo_1280x720_10mb.mp4 -i test/frames360_0001.png -filter_complex 'overlay=main_w-overlay_w-10:10' test/SampleVideo_1280x720_water.mp4
3.22 视频提亮效果器,-vf eq=brightness=0.25
ffmpeg -i SampleVideo_1280x720_10mb.flv -c:v libx264 -b:v 800k -c:a libfdk_aac -vf eq=brightness=0.25 -f mp4 test/brightness_0_25.mp4
3.23 视频增加对比度,-vf eq=contrast=1.5
ffmpeg -i SampleVideo_1280x720_10mb.flv -c:v libx264 -b:v 800k -c:a libfdk_aac -vf eq=contrast=1.5 -f mp4 test/contrast_1_5.mp4
3.24 视频旋转效果,-vf "transpose=1"
ffmpeg -i SampleVideo_1280x720_10mb.mp4 -vf "transpose=1" -b:v 600k test/transpose_1.mp4
3.25 视频裁剪效果
ffmpeg -i SampleVideo_1280x720_10mb.mp4 -an -vf "crop=240:480:120:0" -vcodec libx264 -b:v 600k test/crop_240x480x120.mp4
"crop=out_w:out_h:x:y" 裁剪的宽度和高度,x和y为起始的坐标
3.26 rgb转jpeg格式的图片,-vcodec mjpeg
ffmpeg -f rawvideo -pix_fmt rgb24 -s 1280x720 -i frames0.rgb -f image2 -vcodec mjpeg rgbtojpg.jpg
3.27 YUV视频转为png/jpeg格式的图片,-vcodec png
ffmpeg -f rawvideo -pix_fmt yuv420p -framerate 25 -s 1280x720 -i SampleVideo_1280x720_10mb_3s.yuv -f image2 -vcodec png test/frames_%04d.png
ffmpeg -f rawvideo -pix_fmt yuv420p -framerate 25 -s 1280x720 -i SampleVideo_1280x720_10mb_3s.yuv -f image2 -vcodec mjpeg test/frames_%04d.jpg
3.28 两个音频文件两路流封装到一个文件中
ffmpeg -i yehaizi.wav -i yong.wav -map 0:a -c:a:0 libfdk_aac -b:a:0 96k -map 1:a -c:a:1 libfdk_aac -b:a:1 64k -vn -f mp4 test/yehaizi_yong.m4
-map 0:a 表示第0路的audio
-c:a:0 表示第0路的audio的编码为libfdk_aac格式的