欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

音视频高级开发人员指南注释-5]使用 FFmpeg 命令行工具

最编程 2024-07-12 15:20:05
...
目录
  • 1. ffprobe-查看音视频文件的信息
    • 1.1 查看音频信息
    • 1.2 显示format信息,-show_format
    • 1.3 以json的形式来show stream里面的内容,-print_format json -show_streams
    • 1.4 显示每一帧的信息,-show_frames
    • 1.5 显示packets的信息,-show_packets
  • 2. ffplay-播放音视频文件
    • 2.1 播放mp3或者mp4文件
    • 2.2 循环播放3次,-loop 3
    • 2.3 指定视频的音频流为1,一个视频中可以有多个音频流,-ast 1
    • 2.4 指定播放视频中的视频流为2,一个视频中可以有多个视频流,-vst 1
    • 2.5 播放pcm时需要指定参数,-f为格式,声道,采样率
    • 2.6 mp4 -> YUV -> 提取每一帧YUV -> 播放一帧YUV
      • 2.6.1 从原视频的第10s开始,剪切出3s
      • 2.6.2 将3s的mp4视频转换成YUV格式的
      • 2.6.3 从3s 25fps的yuv视频中,提取每帧yuv
      • 2.6.4 播放一帧yuv
    • 2.7 将yuv转换成rgb,并显示出来
      • 2.7.1 将yuv转为rgb
      • 2.7.2 将rgb显示出来
    • 2.8 同步,-sync audio/video/ext
  • 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格式的

原文地址:https://www.cnblogs.com/pyjetson/p/14829198.html