音视频八股文(3)--ffmpeg 常见命令(2)
07-ffplay 命令播放媒体
播放本地文件
播放本地 MP4 视频文件
test.mp4
的命令,从第 2 秒位置开始播放,播放时长为 10 秒,并且在窗口标题中显示 "test time":
播放本地 MP3 音频文件
buweishui.mp3
的命令:
播放网络流
播放网络 RTMP 流的命令,使用
-window_title
参数设置窗口标题为 "rtmp stream",并指定流地址为rtmp://202.69.69.180:443/webcast/bshdlive-pc
:
强制解码器
使用 MPEG-4 解码器播放
test.mp4
视频文件:
使用 H.264 解码器播放
test.mp4
视频文件:
这里主要是为了区分两个不同的解码器而使用了 -vcodec
参数,并将其值设为 mpeg4
或 h264
。
禁用音频或视频
禁用视频播放,只播放音频:
禁用音频播放,只播放视频:
在这里,我们使用了 -vn
参数来禁止播放视频,只播放音频,或者使用 -an
参数来禁止播放音频,只播放视频。
播放 YUV 数据
播放 YUV 数据文件
yuv420p_320x240.yuv
,指定像素格式为yuv420p
,视频大小为 320x240,帧率为 5:
播放 RGB 数据
播放 RGB 数据文件
rgb24_320x240.rgb
,指定像素格式为rgb24
,视频大小为 320x240:
播放 RGB 数据文件
rgb24_320x240.rgb
,指定像素格式为rgb24
,视频大小为 320x240,帧率为 5:
播放 PCM 数据
播放 PCM 数据文件
48000_2_f32le.pcm
,指定采样率为 48000 Hz,声道数为 2,格式为 32 位浮点型:
-ar set audio sampling rate (in Hz) (from 0 to INT_MAX) (default 0)-ac set number of audio channels (from 0 to INT_MAX) (default 0)
08-ffplay 简单过滤器
视频旋转
旋转
test.mp4
视频文件,将它逆时针旋转 90 度并播放:
视频反转
水平翻转
test.mp4
视频文件并播放:
垂直翻转
test.mp4
视频文件并播放:
视频旋转和反转
先水平翻转,再逆时针旋转 90 度播放
test.mp4
视频文件:
这里我们使用了 -vf
参数,指定了两个视频滤镜,先对视频进行水平翻转,再进行逆时针旋转 90 度。
音频变速播放
将
test.mp4
视频文件中的音频进行变速播放,加快倍速为原来的 2 倍:
这里我们使用了 -af
参数,指定了一个音频滤镜 atempo=2
,表示将音频加快倍速为原来的 2 倍。
视频变速播放
将
test.mp4
视频文件进行变速播放,加快倍速为原来的 2 倍:
这里我们使用了 -vf
参数,指定了一个视频滤镜 setpts=PTS/2
,表示将视频加快倍速为原来的 2 倍。
音视频同时变速
将
test.mp4
视频文件中的音频和视频同时进行变速播放,加快倍速为原来的 2 倍:
这里我们使用了 -vf
参数指定了一个视频滤镜 setpts=PTS/2
,将视频加快倍速为原来的 2 倍,同时使用了 -af
参数指定了一个音频滤镜 atempo=2
,将音频加快倍速为原来的 2 倍。
更多参考
http://www.ffmpeg.org/ffmpeg-filters.html
09-ffmpeg 命令参数说明
主要参数
● -i 设定输入流● -f 设定输出格式(format)● -ss 开始时间● -t 时间长度
音频参数
● -aframes 设置要输出的音频帧数● -b:a 音频码率● -ar 设定采样率● -ac 设定声音的 Channel 数● -acodec 设定声音编解码器,如果用 copy 表示原始编解码数据必须被拷贝。● -an 不处理音频● -af 音频过滤器 ffmpeg -i test.mp4 -b:a 192k -ar 48000 -ac 2 -acodec libmp3lame -aframes 200 out2.mp3
视频参数
● -vframes 设置要输出的视频帧数● -b 设定视频码率● -b:v 视频码率● -r 设定帧速率● -s 设定画面的宽与高● -vn 不处理视频● -aspect aspect 设置横纵比 4:3 16:9 或 1.3333 1.7777● -vcodec 设定视频编解码器,如果用 copy 表示原始编解码数据必须被拷贝。● -vf 视频过滤器
将
test.mp4
视频文件转换为 H.265 编码格式的视频文件,并进行参数设置,输出视频文件的帧数为 300,视频码率为 300 kbps,帧率为 30 fps,分辨率为 640x480(宽高比为 16:9):
在这个命令中,我们使用 -i
参数指定了输入文件为 test.mp4
,并使用了 -vcodec
参数将输出的视频编码格式设置为 H.265。同时还使用了 -vframes
、-b:v
、-r
、-s
和 -aspect
等参数来对输出视频进行了多种设置,以确保输出文件满足我们的需求。最后,我们将输出文件命名为 output.mp4
。
10-ffmpeg 命令提取音视频数据
保留封装格式
将
test.mp4
视频文件中的音频流提取出来,保留原始编码格式,并输出到audio.mp4
文件中:
将
test.mp4
视频文件中的视频流提取出来,保留原始编码格式,并输出到video.mp4
文件中:
这里我们使用了 -acodec
参数和 -vcodec
参数分别对音频流和视频流进行了原始编码格式的复制,并将其分别输出到 audio.mp4
和 video.mp4
文件中。由于保留了原始编码格式,因此输出文件的封装格式与输入文件相同。同时,在第一个命令中使用了 -vn
参数指定只输出音频流,而在第二个命令中使用了 -an
参数指定只输出视频流。
提取视频
从
test.mp4
视频文件中提取视频流,并保留原始编码格式,输出为 H.264 编码格式的文件test_copy.h264
:
从
test.mp4
视频文件中提取视频流,并将其强制转换为 H.264 编码格式,输出为文件test.h264
:
这里我们使用了 -vcodec
参数分别对视频流进行了编码格式的指定。在第一个命令中,我们保留了原始编码格式,并直接将视频流复制到输出文件中;而在第二个命令中,我们强制将视频流转换为 H.264 编码格式。同时,在第二个命令中还省略了音频部分,使用了 -an
参数。
提取音频
从
test.mp4
视频文件中提取音频流,并保留原始编码格式,输出为 AAC 编码格式的文件test.aac
:
从
test.mp4
视频文件中提取音频流,并将其强制转换为 MP3 编码格式,输出为文件test.mp3
:
这里我们使用了 -acodec
参数分别对音频流进行了编码格式的指定。在第一个命令中,我们保留了原始编码格式,并直接将音频流复制到输出文件中;而在第二个命令中,我们强制将音频流转换为 MP3 编码格式。同时,在第二个命令中还省略了视频部分,使用了 -vn
参数。
11 提取像素格式和 PCM 数据
提取像素格式
提取 YUV
从
test_1280x720.mp4
视频文件中提取前 3 秒的视频数据,并输出为 YUV 格式文件yuv420p_orig.yuv
,分辨率与源视频相同(默认为 1280x720):
从
test_1280x720.mp4
视频文件中提取前 3 秒的视频数据,并输出为 YUV 格式文件yuv420p_320x240.yuv
,同时将输出分辨率设置为 320x240:
这里我们使用了 -t
参数指定只抽取前 3 秒的数据,使用了 -pix_fmt
参数指定了输出文件的像素格式为 yuv420p
,同时在第二个命令中使用了 -s
参数指定了输出文件的分辨率为 320x240。
提取 RGB
从
test.mp4
视频文件中提取前 3 秒的视频数据,并输出为 RGB 格式文件rgb24_320x240.rgb
,同时将输出分辨率设置为 320x240:
将之前生成的 YUV 格式文件
yuv420p_320x240.yuv
转换成 RGB 格式文件rgb24_320x240_2.rgb
,分辨率为 320x240:
这里我们使用了 -t
参数指定只抽取前 3 秒的数据,在第一个命令中使用了 -pix_fmt
参数指定了输出文件的像素格式为 rgb24
,同时在两个命令中都使用了 -s
参数指定了输出文件的分辨率。在第二个命令中,我们将之前生成的 YUV 格式文件通过 -pix_fmt
参数转换成了 RGB 格式文件。
提取 PCM 数据
从音频文件
buweishui.mp3
中提取 PCM 格式的音频数据,采样率为 48000 Hz,声道数为 2,采样格式为 signed 16-bit little-endian,并输出为文件48000_2_s16le.pcm
:
将音频文件
buweishui.mp3
转换为带有 signed 16-bit 采样格式的 WAV 音频文件out_s16.wav
,采样率为 48000 Hz,声道数为 2:
将音频文件
buweishui.mp3
转换为 PCM 格式的 WAV 音频文件out2_s16le.wav
,采样率为 48000 Hz,声道数为 2,采样格式为 signed 16-bit little-endian:
从音频文件
buweishui.mp3
中提取 PCM 格式的音频数据,采样率为 48000 Hz,声道数为 2,采样格式为 float 32-bit little-endian,并输出为文件48000_2_f32le.pcm
:
从视频文件
test.mp4
中提取前 10 秒的音频数据,采样率为 48000 Hz,声道数为 2,采样格式为 float 32-bit little-endian,并输出为文件48000_2_f32le_2.pcm
:
这里我们使用了 -ar
参数、-ac
参数和 -f
参数分别对采样率、声道数和采样格式进行了指定。同时,我们在第一、四、五条命令中使用 -acodec
参数指定输出文件的音频编解码器。在第二和第三条命令中,我们将输出文件的格式设置为 WAV,并使用 -sample_fmt
参数指定其采样格式。
12-ffmpeg 命令转封装
保持编码格式
将视频文件
test.mp4
中的视频数据和音频数据分别以原始编码格式拷贝到输出文件test_copy.ts
中:
将视频文件
test.mp4
中的视频数据和音频数据以原始编码格式拷贝到输出文件test_copy2.ts
中:
这里我们使用了 -vcodec
参数和 -acodec
参数分别指定视频流和音频流的编码器为原始编码格式,并使用了 copy
关键字将其直接拷贝到输出文件中。在第二个命令中,我们使用 -codec
参数同时对视频流和音频流指定了原始编码格式。
改变编码格式
将视频文件
test.mp4
中的视频数据转换为 H.265 编码格式,音频数据转换为 MP3 格式,并将其保存为 Matroska 文件out_h265_mp3.mkv
:
这里我们使用了 -c:v
参数和 -c:a
参数分别指定视频流和音频流的编码器为 libx265 和 libmp3lame。
修改帧率
将视频文件
test.mp4
中的帧率改为 15 fps,并将修改后的视频数据拷贝到输出文件output.mp4
中(注意:此命令不正确,因为-codec copy
参数会禁止重新编码视频流,但改变帧率需要重新编码视频流):
将视频文件
test.mp4
中的帧率改为 15 fps,并重新编码输出为视频文件output2.mp4
:
这里我们使用了 -r
参数指定输出视频的帧率为 15 fps。在第一个命令中,由于加入了 -codec copy
参数导致视频流没有被重新编码,因此无法对帧率进行修改。在第二个命令中,我们删除了 -codec copy
参数并在输出文件名中指定了新的文件名。由于重新编码视频流需要消耗大量的计算资源和时间,因此在使用 -r
参数时应该谨慎考虑是否有必要重新编码视频流。
修改视频码率
将视频文件
test.mp4
中的视频码率限制为 400kpbs,并重新编码音视频数据保存为 Matroska 文件output_b.mkv
:
这里我们使用了 -b:v
参数指定输出视频流的比特率为 400kpbs,由于没有使用 -b:a
参数指定音频流的比特率,因此默认情况下音频流也会被重新编码。在实际应用中,可以通过设置不同的比特率来平衡视频质量和文件大小之间的关系。需要注意的是,修改视频码率会导致视频质量的损失,因此应该根据具体需求谨慎调整。
修改视频码率
将视频文件
test.mp4
中的视频码率限制为 400kpbs,并不重新编码音频数据,将编码后的音频数据和原始视频流混合保存为 Matroska 文件output_bv.mkv
:
这里我们使用了 -b:v
参数指定输出视频流的比特率为 400kpbs,并使用 -c:a copy
参数直接将原始音频流拷贝到输出文件中。由于没有重新编码音频流,因此无需消耗大量计算资源和时间,同时也避免了音频质量的损失。
修改音频码率
将视频文件
test.mp4
中的音频码率限制为 192kpbs,并重新编码音频数据,将编码后的音频数据和原始视频流混合保存为 MP4 文件output_ba.mp4
:
这里我们使用了 -b:a
参数指定输出音频流的比特率为 192kpbs,由于没有加入 -vcodec copy
参数禁止重新编码视频流,因此会自动重新编码音频流。需要注意的是,重新编码音频流可能会导致音频质量的损失,因此应该根据具体需求谨慎调整。
如果不想重新编码 video,需要加上-vcodec copy
修改音视频码率
将视频文件
test.mp4
中的视频码率限制为 400kpbs,音频码率限制为 192kpbs,并分别重新编码视频数据和音频数据,将编码后的音视频数据混合保存为 MP4 文件output_bva.mp4
:
这里我们使用了 -b:v
参数和 -b:a
参数分别指定输出视频流和音频流的比特率,同时由于没有加入 -vcodec copy
和 -c:a copy
参数禁止直接拷贝原始数据,因此会自动重新编码音视频数据。需要注意的是,重新编码音视频数据可能会导致视频和音频质量的损失,因此应该根据具体需求谨慎调整。
修改视频分辨率
将视频文件
test.mp4
中的分辨率限制为 480x270,并重新编码视频数据保存为 MP4 文件output_480x270.mp4
:
这里我们使用了 -s
参数指定输出视频流的分辨率为 480x270,由于修改分辨率需要重新编码视频流,因此会自动重新编码视频数据。需要注意的是,重新编码视频数据可能会导致视频质量的损失,同时也会消耗大量计算资源和时间,因此应该根据具体需求谨慎调整。
修改音频采样率:
将视频文件
test.mp4
中的音频采样率修改为 44100Hz,并重新编码音频数据保存为 MP4 文件output_44100hz.mp4
:
这里我们使用了 -ar
参数指定输出音频流的采样率为 44100Hz,由于修改采样率需要重新编码音频流,因此会自动重新编码音频数据。需要注意的是,重新编码音频数据可能会导致音频质量的损失,同时也会消耗大量计算资源和时间,因此应该根据具体需求谨慎调整。
13-ffmpeg 命令过滤器
生成测试文件
找三个不同的视频每个视频截取 10 秒内容
如果音视频格式不统一则强制统一为 -vcodec libx264 -acodec aac
将上述 1.mp4/2.mp4/3.mp4 转成 ts 格式
转成 flv 格式
开始拼接文件
以 MP4 格式进行拼接
方法 1:ffmpeg -i "concat:1.mp4|2.mp4|3.mp4" -codec copy out_mp4.mp4
方法 2:ffmpeg -f concat -i mp4list.txt-codec copy out_mp42.mp4
以 TS 格式进行拼接
方法 1:ffmpeg -i "concat:1.ts|2.ts|3.ts" -codec copy out_ts.mp4
方法 2:ffmpeg -f concat -i tslist.txt -codec copy out_ts2.mp4
以 FLV 格式进行拼接
方法 1:ffmpeg -i "concat:1.flv|2.flv|3.flv" -codec copy out_flv.mp4
方法 2:ffmpeg -f concat -i flvlist.txt -codec copy out_flv2.mp4
方法 1 只适用部分封装格式,比如 TS 建议:(1)使用方法 2 进行拼接(2)转成 TS 格式再进行拼接
测试不同编码拼接
修改音频编码
● ffmpeg -i 2.mp4 -vcodeccopy -acodec ac3 -vbsfh264_mp4toannexb 2.ts● ffmpeg -i "concat:1.ts|2.ts|3.ts" -codec copy out1.mp4 结果第二段没有声音
修改音频采样率
● ffmpeg -i 2.mp4 -vcodec copy -acodec aac -ar 96000 -vbsf h264_mp4toannexb 2.ts● ffmpeg -i "concat:1.ts|2.ts|3.ts" -codec copy out2.mp4 第二段播放异常
修改视频编码格式
修改视频分辨率
注意:● 把每个视频封装格式也统一为 ts,拼接输出的时候再输出你需要的封装格式,比如 MP4● 视频分辨率可以不同,但是编码格式需要统一● 音频编码格式需要统一,音频参数(采样率/声道等)也需要统一
14-fmpeg 命令图片与视频互转
截取一张图片
参数说明:● -i 输入
● -y 覆盖
● -f 格式 image2 一种格式
● -ss 起始值
● -vframes 帧 如果大于 1 那么 输出加 %03d test%03d.jpg
● -s 格式大小 size
转换视频为图片(每帧一张图):
图片转换为视频:
从视频中生成 GIF 图片
将 GIF 转化为 视频
15-ffmpeg 命令视频录制
ffmpeg 命令视频录制(Windows)
先安装 dshow 软件 Screen Capturer Recorder● 项目地址:https://sourceforge.net/projects/screencapturer/files/● 然后查看可用设备名字:ffmpeg -list_devices true -f dshow -i dummy[dshow @ 0509d6c0] DirectShow video devices (some may be both video and audio devices)[dshow @ 0509d6c0] "Integrated Webcam" //笔记本摄像头[dshow @ 0509d6c0] Alternative name "@device_pnp_\?\usb#vid_0bda&pid_5689&mi_00#6&233dd6c7&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global"[dshow @ 0509d6c0] "e2eSoft VCam"[dshow @ 0509d6c0] Alternative name "@device_sw_{860BB310-5D01-11D0-BD3B-00A0C911CE86}\e2eSoft VCam"[dshow @ 0509d6c0] "screen-capture-recorder"[dshow @ 0509d6c0] Alternative name "@device_sw_{860BB310-5D01-11D0-BD3B-00A0C911CE86}{4EA6930A-2C8A-4AE6-A561-56E4B5044439}"[dshow @ 0509d6c0] DirectShow audio devices[dshow @ 0509d6c0] "楹﹀厠椋?(Realtek Audio)"[dshow @ 0509d6c0] Alternative name "@device_cm_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\wave_{8B8892E5-D3E5-47EC-8B5E-CEEBF54014E7}"[dshow @ 0509d6c0] "virtual-audio-capturer"[dshow @ 0509d6c0] Alternative name "@device_sw_{33D9A762-90C8-11D0-BD43-00A0C911CE86}{8E14549B-DB61-4309-AFA1-3578E927E935}"dummy: Immediate exit requested
如果出现乱码的时候在命令行输入:chcp 65001
chcp 就是 change code page65001 是 unicode 字符集 支持中文
音视频录制
录制视频(默认参数)
● 桌面:ffmpeg -f dshow -i video="screen-capture-recorder" v-out.mp4● 摄像头: ffmpeg -f dshow -i video="Integrated Webcam" -y v-out2.flv (要根据自己摄像头名称)
录制声音(默认参数)
● 系统声音:ffmpeg -f dshow -i audio="virtual-audio-capturer" a-out.aac● 系统+麦克风声音:ffmpeg -f dshow -i audio="麦克风 (Realtek Audio)"-f dshow -i audio="virtual-audio-capturer" -filter_complex amix=inputs=2:duration=first:dropout_transition=2 a-out2.aac
同时录制声音和视频(默认参数)
查看视频录制的可选参数
查看视频录制的可选参数
[dshow @ 02f0d6c0] DirectShow video device options (from video devices)[dshow @ 02f0d6c0] Pin "Capture" (alternative pin name "1")[dshow @ 02f0d6c0] pixel_format=bgr0 min s=1x1 fps=0.02 max s=1920x1080 fps=30[dshow @ 02f0d6c0] pixel_format=bgr0 min s=1x1 fps=0.02 max s=1920x1080 fps=30[dshow @ 02f0d6c0] pixel_format=bgr24 min s=1x1 fps=0.02 max s=1920x1080 fps=30[dshow @ 02f0d6c0] pixel_format=rgb555le min s=1x1 fps=0.02 max s=1920x1080 fps=30[dshow @ 02f0d6c0] pixel_format=rgb555le min s=1x1 fps=0.02 max s=1920x1080 fps=30[dshow @ 02f0d6c0] pixel_format=rgb8 min s=1x1 fps=0.02 max s=1920x1080 fps=30[dshow @ 02f0d6c0] pixel_format=yuv420p min s=1x1 fps=0.02 max s=1920x1080 fps=30
查看音频录制的可选参数
[dshow @ 05a2d6c0] DirectShow audio only device options (from audio devices)[dshow @ 05a2d6c0] Pin "Capture Virtual Audio Pin" (alternative pin name "1")[dshow @ 05a2d6c0] min ch=2 bits=16 rate= 48000 max ch=2 bits=16 rate= 48000
指定参数录制音视频
桌面+摄像头+麦克风
rtp 推流
先用 ffplay 检测摄像头是否正常,比如:
推流:ffmpeg -f dshow -i video="USB2.0 PC CAMERA" -vcodec libx264 -f rtp rtp://192.168.2.208:6970 > test.sdp
拉流:ffplay -protocol_whitelist "file,udp,rtp" -i test.sdp
16-ffmpeg 命令直播
直播拉流
对于不是 rtmp 的协议 -c copy 要谨慎使用
可用地址现在已经找不到了
ffmpeg 推流
直播推流
参考:Nginx 搭建 rtmp 流媒体服务器(Ubuntu 16.04)https://www.jianshu.com/p/16741e363a77
版权声明: 本文为 InfoQ 作者【福大大架构师每日一题】的原创文章。
原文链接:【http://xie.infoq.cn/article/e47a7da97cc00ed1e630dc6d1】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论