FFmpeg学习(二)FFmpeg命令学习
一:FFmpeg音视频处理流程
案例:
二:FFmpeg命令基本分类
官方网站:https://ffmpeg.org/documentation.html
官方文档:https://ffmpeg.org/ffmpeg.html
(一)基本信息查询命令
详细见:https://www.jianshu.com/p/a6e711cd3f8d
(二) 录制命令
1.mac下面的命令
ffmpeg -f avfoundation -i 1 -r 30 out.yuv #注释:使用avfoundation以30帧的频率进行录屏输出为out.yuv文件
-f : 指定使用avfoundation采集数据,设定输出设备 -i :指定从哪采集数据,它是一个文件索引号,在MAC上,1代表桌面 -r : 指定帧率
录制音频:https://www.jianshu.com/p/e63c063987b6
2.其他设备下:https://blog.csdn.net/shaosunrise/article/details/81068080
3.基于2中测试linux使用命令
(1)查看设备
ffmpeg -devices -hide_banner
注:-hide_banner 所有FFmpeg工具通常都会显示版权声明、构建选项和库版本(如下图所示)。此选项可用于禁止打印此信息。
(2)录制视频(使用设备中x11grab)
ffmpeg -video_size 1024x768 -framerate 25 -f x11grab -i :0.0+100,200 v-out.mp4
上面的参数,指的是从屏幕的左上角(x=100, y=200)的位置,录制分辨率为1024×768的视频。
-i :0.0+100,200 其中:0.0是X11服务的显示屏幕号,与DISPLAY环境变量相同:
DISPLAY=:0.0
在Linux/Unix类操作系统上, DISPLAY用来设置将图形显示到何处.
直接登陆图形界面或者登陆命令行界面后使用startx启动图形, DISPLAY环境变量将自动设置为:0.0, 此时可以打开终端, 输出图形程序的名称(比如xclock)来启动程序, 图形将显示在本地窗口上, 在终端上输入printenv查看当前环境变量, 输出结果中有如下内容:
DISPLAY 环境变量格式如下host:NumA.NumB,
host:指Xserver所在的主机主机名或者ip地址, 图形将显示在这一机器上, 可以是启动了图形界面的Linux/Unix机器, 也可以是安装了Exceed, X-Deep/32等Windows平台运行的Xserver的Windows机器.
如果Host为空, 则表示Xserver运行于本机, 并且图形程序(Xclient)使用unix socket方式连接到Xserver,而不是TCP方式.
使用TCP方式连接时, NumA为连接的端口减去6000的值, 如果NumA为0, 则表示连接到6000端口; 使用unix socket方式连接时则表示连接的unix socket的路径, 如果为0, 则表示连接到/tmp/.X11-unix/X0 .
NumB则几乎总是0.
100是抓取时的x偏移量,200是y偏移量。
ffplay v-out.mp4 #读取视频
(3)基于(2)使用ALSA同时录制声音:https://blog.csdn.net/rong11417/article/details/102880549
ffmpeg -video_size 1024x768 -framerate 25 -f x11grab -i :0.0+100,200 -f alsa -ac 2 -i hw:0 av-out.mkv
ALSA (Advanced Linux Sound Architecture)设备(这里作为输入设备)。
要在配置过程中启用这个输入设备,您需要在系统上安装libasound。该设备允许从ALSA设备(设备存在)捕获。要捕获的设备名称必须是ALSA(card identifier)卡标识符。ALSA标识符具有语法:
hw:CARD[,DEV[,SUBDEV]] #其中DEV和SUBDEV组件是可选的。这三个参数(顺序:CARD、DEV、SUBDEV)指定卡号或标识符、设备号和子设备号(-1表示任意)。
要查看系统当前识别的cards列表,请检查文件/proc/asound/cards和/proc/asound/devices.
或者使用以下命令显示详细信息:
aplay -l
arecord -l
例如,要使用ffmpeg从卡id为0的ALSA设备捕获,可以运行命令:
ffmpeg -f alsa -i hw:0 alsaout.wav
-ac[:stream_specifier] channels (input/output,per-stream)
设置音频通道数。对于输出流,默认设置为输入音频通道的数量。对于输入流,此选项仅对音频抓取设备和原始demuxers有意义,并映射到相应的demuxer选项。
(三)分解与复用
1.文件格式转换
ffmpeg -i gfxm.mp4 -vcodec copy -acodec copy out.flv #音视频编码处理方式都是copy,不改变
ffmpeg version N-101559-ga1cd419 Copyright (c) 2000-2021 the FFmpeg developers built with gcc 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.12) 20160609 configuration: --enable-shared --prefix=/usr/local/ffmpeg --enable-gpl --enable-libx264 --enable-libx265 --enable-debug --disable-optimizations --enable-pthreads --enable-shared libavutil 56. 68.100 / 56. 68.100 libavcodec 58.132.100 / 58.132.100 libavformat 58. 74.100 / 58. 74.100 libavdevice 58. 12.100 / 58. 12.100 libavfilter 7.109.100 / 7.109.100 libswscale 5. 8.100 / 5. 8.100 libswresample 3. 8.100 / 3. 8.100 libpostproc 55. 8.100 / 55. 8.100 Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'gfxm.mp4': Metadata: major_brand : isom minor_version : 512 compatible_brands: isomiso2avc1mp41 encoder : Multimedia Cloud Transcode (cloud.baidu.com) Duration: 00:02:01.11, start: 0.000000, bitrate: 746 kb/s Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 864x486 [SAR 1:1 DAR 16:9], 679 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default) Metadata: handler_name : VideoHandler vendor_id : [0][0][0][0] Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 64 kb/s (default) Metadata: handler_name : SoundHandler vendor_id : [0][0][0][0] Output #0, flv, to 'out.flv': Metadata: major_brand : isom minor_version : 512 compatible_brands: isomiso2avc1mp41 encoder : Lavf58.74.100 Stream #0:0(und): Video: h264 (High) ([7][0][0][0] / 0x0007), yuv420p, 864x486 [SAR 1:1 DAR 16:9], q=2-31, 679 kb/s, 25 fps, 25 tbr, 1k tbn, 12800 tbc (default) Metadata: handler_name : VideoHandler vendor_id : [0][0][0][0] Stream #0:1(und): Audio: aac (LC) ([10][0][0][0] / 0x000A), 44100 Hz, stereo, fltp, 64 kb/s (default) Metadata: handler_name : SoundHandler vendor_id : [0][0][0][0] Stream mapping: Stream #0:0 -> #0:0 (copy) Stream #0:1 -> #0:1 (copy) Press [q] to stop, [?] for help frame= 0 fps=0.0 q=-1.0 size= 0kB time=00:00:00.00 bitrate=N/A speed= frame= 3024 fps=0.0 q=-1.0 Lsize= 11128kB time=00:02:01.06 bitrate= 753.0kbits/s speed=3.03e+03x video:10028kB audio:954kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 1.330767%
ffplay out.flv
ffplay version N-101559-ga1cd419 Copyright (c) 2003-2021 the FFmpeg developers built with gcc 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.12) 20160609 configuration: --enable-shared --prefix=/usr/local/ffmpeg --enable-gpl --enable-libx264 --enable-libx265 --enable-debug --disable-optimizations --enable-pthreads --enable-shared libavutil 56. 68.100 / 56. 68.100 libavcodec 58.132.100 / 58.132.100 libavformat 58. 74.100 / 58. 74.100 libavdevice 58. 12.100 / 58. 12.100 libavfilter 7.109.100 / 7.109.100 libswscale 5. 8.100 / 5. 8.100 libswresample 3. 8.100 / 3. 8.100 libpostproc 55. 8.100 / 55. 8.100 Input #0, flv, from 'out.flv':= 0KB vq= 0KB sq= 0B f=0/0 Metadata: major_brand : isom minor_version : 512 compatible_brands: isomiso2avc1mp41 encoder : Lavf58.74.100 Duration: 00:02:01.17, start: 0.057000, bitrate: 752 kb/s Stream #0:0: Video: h264 (High), yuv420p(progressive), 864x486 [SAR 1:1 DAR 16:9], 679 kb/s, 25 fps, 25 tbr, 1k tbn, 50 tbc Stream #0:1: Audio: aac (LC), 44100 Hz, stereo, fltp, 64 kb/s 11.07 A-V: 0.036 fd= 0 aq= 10KB vq= 18KB sq= 0B f=0/0
2.抽取视频
ffmpeg -i input_file -vcodec copy -an output_file_video #-an表示不需要音频数据
ffmpeg -i gfxm.mp4 -vcodec copy -an out.h264 #注意:后缀需要对应视频/音频编码
ffplay version N-101559-ga1cd419 Copyright (c) 2003-2021 the FFmpeg developers built with gcc 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.12) 20160609 configuration: --enable-shared --prefix=/usr/local/ffmpeg --enable-gpl --enable-libx264 --enable-libx265 --enable-debug --disable-optimizations --enable-pthreads --enable-shared libavutil 56. 68.100 / 56. 68.100 libavcodec 58.132.100 / 58.132.100 libavformat 58. 74.100 / 58. 74.100 libavdevice 58. 12.100 / 58. 12.100 libavfilter 7.109.100 / 7.109.100 libswscale 5. 8.100 / 5. 8.100 libswresample 3. 8.100 / 3. 8.100 libpostproc 55. 8.100 / 55. 8.100 Input #0, h264, from 'out.h264': 0KB vq= 0KB sq= 0B f=0/0 Duration: N/A, bitrate: N/A Stream #0:0: Video: h264 (High), yuv420p(progressive), 864x486 [SAR 1:1 DAR 16:9], 25 fps, 25 tbr, 1200k tbn, 50 tbc nan M-V: nan fd= 1 aq= 0KB vq= 64KB sq= 0B f=0/0
3.抽取音频
ffmpeg -i input_file -vcodec copy -vn output_file_audio #-vn表示不需要视频数据
ffmpeg -i gfxm.mp4 -acodec copy -vn out.aac #注意:后缀需要对应视频/音频编码
ffplay version N-101559-ga1cd419 Copyright (c) 2003-2021 the FFmpeg developers built with gcc 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.12) 20160609 configuration: --enable-shared --prefix=/usr/local/ffmpeg --enable-gpl --enable-libx264 --enable-libx265 --enable-debug --disable-optimizations --enable-pthreads --enable-shared libavutil 56. 68.100 / 56. 68.100 libavcodec 58.132.100 / 58.132.100 libavformat 58. 74.100 / 58. 74.100 libavdevice 58. 12.100 / 58. 12.100 libavfilter 7.109.100 / 7.109.100 libswscale 5. 8.100 / 5. 8.100 libswresample 3. 8.100 / 3. 8.100 libpostproc 55. 8.100 / 55. 8.100 [aac @ 0x7fbf5c0009c0] Estimating duration from bitrate, this may be inaccurate Input #0, aac, from 'out.aac': Duration: 00:03:02.33, bitrate: 44 kb/s Stream #0:0: Audio: aac (LC), 44100 Hz, stereo, fltp, 44 kb/s 5.99 M-A: 0.000 fd= 0 aq= 8KB vq= 0KB sq= 0B f=0/0
(四)处理原始数据命令
补充:音视频开发基础概述 - PCM、YUV、H264、常用软件介绍
1.提取YUV数据(对于视频的裸数据而言,用得更多的是 YUV 数据格式,其中 “Y” 表示明亮度(Luminance 或 Luma),即灰度值;而 “U” 和 “V” 表示的则是色度(Chrominance 或 Chroma),作用是描述影像色彩及饱和度,指定像素的颜色。)
-c:v 表示对v(视频)进行c(编码)
-pix_fmt 指定了视频的像素格式
ffmpeg -i gfxm.mp4 -an -c:v rawvideo -pix_fmt yuv420p out.yuv #注意:-pix_fmt是指定输出的数据编码(可以与原来的视频编码不一致,但是会出现视频乱码等系列问题)
ffmpeg version N-101559-ga1cd419 Copyright (c) 2000-2021 the FFmpeg developers built with gcc 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.12) 20160609 configuration: --enable-shared --prefix=/usr/local/ffmpeg --enable-gpl --enable-libx264 --enable-libx265 --enable-debug --disable-optimizations --enable-pthreads --enable-shared libavutil 56. 68.100 / 56. 68.100 libavcodec 58.132.100 / 58.132.100 libavformat 58. 74.100 / 58. 74.100 libavdevice 58. 12.100 / 58. 12.100 libavfilter 7.109.100 / 7.109.100 libswscale 5. 8.100 / 5. 8.100 libswresample 3. 8.100 / 3. 8.100 libpostproc 55. 8.100 / 55. 8.100 Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'gfxm.mp4': Metadata: major_brand : isom minor_version : 512 compatible_brands: isomiso2avc1mp41 encoder : Multimedia Cloud Transcode (cloud.baidu.com) Duration: 00:02:01.11, start: 0.000000, bitrate: 746 kb/s Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 864x486 [SAR 1:1 DAR 16:9], 679 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default) Metadata: handler_name : VideoHandler vendor_id : [0][0][0][0] Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 64 kb/s (default) Metadata: handler_name : SoundHandler vendor_id : [0][0][0][0] Stream mapping: Stream #0:0 -> #0:0 (h264 (native) -> rawvideo (native)) Press [q] to stop, [?] for help Output #0, rawvideo, to 'out.yuv': Metadata: major_brand : isom minor_version : 512 compatible_brands: isomiso2avc1mp41 encoder : Lavf58.74.100 Stream #0:0(und): Video: rawvideo (I420 / 0x30323449), yuv420p(progressive), 864x486 [SAR 1:1 DAR 16:9], q=2-31, 125971 kb/s, 25 fps, 25 tbn (default) Metadata: handler_name : VideoHandler vendor_id : [0][0][0][0] encoder : Lavc58.132.100 rawvideo frame= 1 fps=0.0 q=-0.0 size= 512kB time=00:00:00.04 bitrate=104857.6kbitframe= 763 fps=0.0 q=-0.0 size= 469248kB time=00:00:30.52 bitrate=125952.8kbitframe= 1213 fps=1194 q=-0.0 size= 745984kB time=00:00:48.52 bitrate=125950.1kbiframe= 1484 fps=974 q=-0.0 size= 912640kB time=00:00:59.36 bitrate=125949.2kbitframe= 1643 fps=812 q=-0.0 size= 1010432kB time=00:01:05.72 bitrate=125950.4kbitframe= 1761 fps=503 q=-0.0 size= 1083136kB time=00:01:10.44 bitrate=125966.1kbitframe= 2018 fps=504 q=-0.0 size= 1241088kB time=00:01:20.72 bitrate=125953.8kbitframe= 2183 fps=483 q=-0.0 size= 1342720kB time=00:01:27.32 bitrate=125968.4kbitframe= 2313 fps=461 q=-0.0 size= 1422592kB time=00:01:32.52 bitrate=125960.6kbitframe= 2435 fps=441 q=-0.0 size= 1497600kB time=00:01:37.40 bitrate=125958.3kbitframe= 2554 fps=424 q=-0.0 size= 1570816kB time=00:01:42.16 bitrate=125960.5kbitframe= 2680 fps=411 q=-0.0 size= 1648384kB time=00:01:47.20 bitrate=125966.1kbitframe= 2807 fps=399 q=-0.0 size= 1726464kB time=00:01:52.28 bitrate=125963.6kbitframe= 2935 fps=390 q=-0.0 size= 1805056kB time=00:01:57.40 bitrate=125954.2kbitframe= 3024 fps=384 q=-0.0 Lsize= 1860044kB time=00:02:00.96 bitrate=125971.2kbits/s speed=15.4x video:1860044kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.000000%
由于数据被变为原始数据,所以播放时要指定像素大小,否则出现以下问题:
ffplay out.yuv -s 864x486 #大小通过提取原始数据时产生的参数获取(在input中)
2.提取PCM数据(通常音频的裸数据格式为脉冲编码调制(Pulse-code modulation,PCM)数据)
ffmpeg -i gfxm.mp4 -vn -ar 44100 -ac 2 -f s16le out.pcm #-ar 采样率 -ac 双声道 -f PCM数据存储格式 s有符号 16位 le小端存储
ffmpeg version N-101559-ga1cd419 Copyright (c) 2000-2021 the FFmpeg developers built with gcc 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.12) 20160609 configuration: --enable-shared --prefix=/usr/local/ffmpeg --enable-gpl --enable-libx264 --enable-libx265 --enable-debug --disable-optimizations --enable-pthreads --enable-shared libavutil 56. 68.100 / 56. 68.100 libavcodec 58.132.100 / 58.132.100 libavformat 58. 74.100 / 58. 74.100 libavdevice 58. 12.100 / 58. 12.100 libavfilter 7.109.100 / 7.109.100 libswscale 5. 8.100 / 5. 8.100 libswresample 3. 8.100 / 3. 8.100 libpostproc 55. 8.100 / 55. 8.100 Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'gfxm.mp4': Metadata: major_brand : isom minor_version : 512 compatible_brands: isomiso2avc1mp41 encoder : Multimedia Cloud Transcode (cloud.baidu.com) Duration: 00:02:01.11, start: 0.000000, bitrate: 746 kb/s Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 864x486 [SAR 1:1 DAR 16:9], 679 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default) Metadata: handler_name : VideoHandler vendor_id : [0][0][0][0] Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 64 kb/s (default) Metadata: handler_name : SoundHandler vendor_id : [0][0][0][0] Stream mapping: Stream #0:1 -> #0:0 (aac (native) -> pcm_s16le (native)) Press [q] to stop, [?] for help Output #0, s16le, to 'out.pcm': Metadata: major_brand : isom minor_version : 512 compatible_brands: isomiso2avc1mp41 encoder : Lavf58.74.100 Stream #0:0(und): Audio: pcm_s16le, 44100 Hz, stereo, s16, 1411 kb/s (default) Metadata: handler_name : SoundHandler vendor_id : [0][0][0][0] encoder : Lavc58.132.100 pcm_s16le size= 20860kB time=00:02:01.06 bitrate=1411.5kbits/s speed= 623x video:0kB audio:20860kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.000000%
注意:对于PCM播放时,我们要制定ar,ac,f参数
ffplay out.pcm -ac 44100 -ac 2 -f s16le
(五)滤镜命令
主要的滤镜操作:画中画 视频的裁剪 音频倍速 水印的添加和删除
1.获取音视频文件--->进行解封装(获取音频和视频数据)--->获得编码过的数据包--->对数据进行解压缩--->获取解码后的数据
2.获取解码后的数据--->对数据进行过滤--->对数据进行重新编码
3.获取编码后的数据---->进行音视频混合封装--->输出
ffmpeg -i gfxm.mp4 -vf crop=in_w-200:in_h-200 -c:v libx264 -c:a copy out.mp4
-i 指定多媒体文件
-vf 使用视频滤镜
crop 对视频进行裁剪操作
in_w 输入的视频宽度
in_h 输入的视频高度
-c:v 对视频进行编码 格式为libx264(视频编码器)
-c:a 对音频进行编码 格式为copy,直接拷贝,不做多处理
注意:crop的参数格式为w:h:x:y, w、h为输出视频的宽和高, x、y标记输入视频中的某点,将该点作为基准点,向右下进行裁剪得到输出视频。 如果x y不写的话,默认居中剪切
(六)音视频裁剪
ffmpeg -i gfxm.mp4 -ss 00:01:00 -t 10 out.ts
-ss 视频的开始时间 00:00:00 时:分:秒 -t 时间长度 单位s
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'gfxm.mp4': Metadata: major_brand : isom minor_version : 512 compatible_brands: isomiso2avc1mp41 encoder : Multimedia Cloud Transcode (cloud.baidu.com) Duration: 00:02:01.11, start: 0.000000, bitrate: 746 kb/s Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 864x486 [SAR 1:1 DAR 16:9], 679 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default) Metadata: handler_name : VideoHandler vendor_id : [0][0][0][0] Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 64 kb/s (default) Metadata: handler_name : SoundHandler vendor_id : [0][0][0][0] Stream mapping: Stream #0:0 -> #0:0 (h264 (native) -> mpeg2video (native)) Stream #0:1 -> #0:1 (aac (native) -> mp2 (native)) Press [q] to stop, [?] for help Output #0, mpegts, to 'out.ts': Metadata: major_brand : isom minor_version : 512 compatible_brands: isomiso2avc1mp41 encoder : Lavf58.74.100 Stream #0:0(und): Video: mpeg2video (Main), yuv420p(progressive), 864x486 [SAR 1:1 DAR 16:9], q=2-31, 200 kb/s, 25 fps, 90k tbn (default) Metadata: handler_name : VideoHandler vendor_id : [0][0][0][0] encoder : Lavc58.132.100 mpeg2video Side data: cpb: bitrate max/min/avg: 0/0/200000 buffer size: 0 vbv_delay: N/A Stream #0:1(und): Audio: mp2, 44100 Hz, stereo, s16, 384 kb/s (default) Metadata: handler_name : SoundHandler vendor_id : [0][0][0][0] encoder : Lavc58.132.100 mp2 frame= 1 fps=0.0 q=0.0 size= 0kB time=00:00:00.35 bitrate= 0.0kbits/sframe= 250 fps=172 q=31.0 Lsize= 1255kB time=00:00:09.96 bitrate=1031.3kbits/s speed=6.85x video:684kB audio:469kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 8.798692%
-f contat 告诉ffmpeg对后面的文件拼接 -i inputs.txt 参数是文件(文件内部是要合并的音视频文件)
注意:需要文件片段为.ts文件,否则不被允许合并(认为不安全)
ffmpeg -f concat -i input.txt out2.flv
(七)图片/视频互转命令
ffmpeg -i out.ts -r 1 -f image2 image-%3d.jpeg
-i 指定要输入的多媒体文件 -r 指定转换图片的频率 1 每秒转出1张图片 -f 指定要转出的图片格式 image2 image-%3d.jpeg 指定每次输出的图片名称
Input #0, mpegts, from 'out.ts': Duration: 00:00:10.01, start: 1.429089, bitrate: 1026 kb/s Program 1 Metadata: service_name : Service01 service_provider: FFmpeg Stream #0:0[0x100]: Video: mpeg2video (Main) ([2][0][0][0] / 0x0002), yuv420p(tv, progressive), 864x486 [SAR 1:1 DAR 16:9], 25 fps, 25 tbr, 90k tbn, 50 tbc Side data: cpb: bitrate max/min/avg: 0/0/0 buffer size: 49152 vbv_delay: N/A Stream #0:1[0x101](und): Audio: mp2 ([3][0][0][0] / 0x0003), 44100 Hz, stereo, fltp, 384 kb/s Stream mapping: Stream #0:0 -> #0:0 (mpeg2video (native) -> mjpeg (native)) Press [q] to stop, [?] for help [swscaler @ 0x2233d00] deprecated pixel format used, make sure you did set range correctly Output #0, image2, to 'image-%3d.jpeg': Metadata: encoder : Lavf58.74.100 Stream #0:0: Video: mjpeg, yuvj420p(pc, progressive), 864x486 [SAR 1:1 DAR 16:9], q=2-31, 200 kb/s, 1 fps, 1 tbn Metadata: encoder : Lavc58.132.100 mjpeg Side data: cpb: bitrate max/min/avg: 0/0/200000 buffer size: 0 vbv_delay: N/A frame= 9 fps=0.0 q=1.6 size=N/A time=00:00:09.00 bitrate=N/A dup=0 drop=180 sframe= 12 fps=0.0 q=1.6 Lsize=N/A time=00:00:12.00 bitrate=N/A dup=0 drop=238 speed=18.2x video:374kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
ffmpeg -i image-%3d.jpeg out5.mp4 #可以通过-r指定每秒放的帧数
Input #0, image2, from 'image-%3d.jpeg': Duration: 00:00:00.48, start: 0.000000, bitrate: N/A Stream #0:0: Video: mjpeg (Baseline), yuvj420p(pc, bt470bg/unknown/unknown), 864x486 [SAR 1:1 DAR 16:9], 25 fps, 25 tbr, 25 tbn, 25 tbc Stream mapping: Stream #0:0 -> #0:0 (mjpeg (native) -> h264 (libx264)) Press [q] to stop, [?] for help [libx264 @ 0x150ab40] using SAR=1/1 [libx264 @ 0x150ab40] using cpu capabilities: none! [libx264 @ 0x150ab40] profile High, level 3.1, 4:2:0, 8-bit [libx264 @ 0x150ab40] 264 - core 161 - H.264/MPEG-4 AVC codec - Copyleft 2003-2021 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=12 lookahead_threads=2 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00 Output #0, mp4, to 'out5.mp4': Metadata: encoder : Lavf58.74.100 Stream #0:0: Video: h264 (avc1 / 0x31637661), yuvj420p(pc, bt470bg/unknown/unknown, progressive), 864x486 [SAR 1:1 DAR 16:9], q=2-31, 25 fps, 12800 tbn Metadata: encoder : Lavc58.132.100 libx264 Side data: cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: N/A frame= 1 fps=0.0 q=0.0 size= 0kB time=00:00:00.00 bitrate=N/A speed=N/Aframe= 12 fps=0.0 q=-1.0 Lsize= 136kB time=00:00:00.36 bitrate=3088.8kbits/s speed=0.488x video:135kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.725236% [libx264 @ 0x150ab40] frame I:1 Avg QP:22.28 size: 15313 [libx264 @ 0x150ab40] frame P:8 Avg QP:24.22 size: 12224 [libx264 @ 0x150ab40] frame B:3 Avg QP:25.58 size: 8081 [libx264 @ 0x150ab40] consecutive B-frames: 50.0% 50.0% 0.0% 0.0% [libx264 @ 0x150ab40] mb I I16..4: 42.0% 53.4% 4.6% [libx264 @ 0x150ab40] mb P I16..4: 27.2% 43.4% 3.9% P16..4: 3.6% 0.8% 0.3% 0.0% 0.0% skip:20.9% [libx264 @ 0x150ab40] mb B I16..4: 6.0% 15.0% 2.1% B16..8: 17.2% 5.9% 1.5% direct: 5.7% skip:46.5% L0:44.3% L1:52.4% BI: 3.3% [libx264 @ 0x150ab40] 8x8 transform intra:58.2% inter:84.8% [libx264 @ 0x150ab40] coded y,uvDC,uvAC intra: 49.6% 74.3% 16.7% inter: 12.2% 17.9% 2.3% [libx264 @ 0x150ab40] i16 v,h,dc,p: 36% 44% 17% 3% [libx264 @ 0x150ab40] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 16% 22% 37% 4% 3% 3% 4% 4% 6% [libx264 @ 0x150ab40] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 21% 29% 17% 5% 6% 6% 7% 5% 4% [libx264 @ 0x150ab40] i8c dc,h,v,p: 35% 35% 25% 5% [libx264 @ 0x150ab40] Weighted P-Frames: Y:0.0% UV:0.0% [libx264 @ 0x150ab40] ref P L0: 52.1% 14.7% 22.6% 10.6% [libx264 @ 0x150ab40] ref B L0: 89.2% 10.8% [libx264 @ 0x150ab40] kb/s:2289.13
(八)直播相关命令
直播推流: -re 这个选项会将输入的读取速度降低到输入的本地帧速率(即原本是音视频同步)。它对于实时输出(例如直播流)很有用。 -i 指定要推流出去的数据 -c 指定编码方式(注意:是同时对音视频处理) -f 要推出的文件格式 rtmp://.... 是服务器地址 其他客户端从服务器中拉流 直播拉流: -i 指定rtmp服务器地址 -c 音视频编码方式 保存为dump.flv
最全最常用的RTMP、RTSP、HTTP协议流常用直播流地址
测试拉流:
CCTV1高清:http://ivi.bupt.edu.cn/hls/cctv1hd.m3u8
ffplay http://ivi.bupt.edu.cn/hls/cctv1hd.m3u8
ffmpeg -i http://ivi.bupt.edu.cn/hls/cctv1hd.m3u8 -c copy dump.flv #拉流一段时间使用ctrl+C停止 --- 最好文件格式一致dump.m3u8
ffplay dump.flv
(一)常见问题---推流失败
主要原因是时间戳问题!!!
在ffmpeg内部是按照最快的优先级,将音频与视频分开,用最快的方式获取!导致原本同步的音视频随着FFmpeg内部机制的改变,导致音视频不同步。导致出现上面的问题(比如本来应该播放音频时,无法找到对应的音频)
解决方法:
-re 这个选项会将输入的读取速度降低到输入的本地帧速率(即是按照音视频同步的速率播放)。它对于实时输出(例如直播流)很有用。
(二)常见问题---清晰度不高(推流)
-f flv会将MP4音频和视频重新进行编码,进行重新编码时可能造成损失!!!造成视频质量降低
解决方法:要么避免不同格式的转换,要么使用下面方案!!
-c copy 告诉我们从一个多媒体文件中读取音频和视频时,不要进行视频重新编码,此时流媒体服务器还是获取原来的数据,所以播放的时候还是原来的音频和视频!!
清晰度会高,但是丢包不会避免!!