ffmpeg 学习:
1. 首先命令行的学习
2. 库的使用
3. 源代码学习
https://blog.csdn.net/candcplusplus/article/details/53955012
-
录制麦克风
-
双声道,MP3 编码,MP3 文件格式
-
$ ffmpeg -f alsa -ac 2 -i hw:0,0 -acodec libmp3lame -f mp3 test1.mp3
-
-
AC3 编码,ACC 文件格式
-
$ ffmpeg -f alsa -ac 2 -i hw:0,0 -acodec ac3 -f ac3 test1.aac
-
-
录制桌面
-
$ ffmpeg -f x11grab -s 1920x1080 -i :0.0 -vcodec libx264 -f mp4 test1.mp4
-
分辨率设为 1080P,并采用 H.264 编码,最后保存为 MP4 格式。
-
-
录制摄像头
-
$ ffmpeg -f video4linux2 -s 1920x1080 -t 30 -i /dev/video0 -vcodec libx264 -f mp4 test2.mp4
-
-t 30 表示录制 30 秒视频。
-
-
录制桌面+麦克风
-
$ ffmpeg -f alsa -ac 2 -i pulse -f x11grab -video_size 1920x1080 -i :0.0 -vcodec libx264 -acodec ac3 test3.mp4
-
-
录制摄像头+麦克风
-
$ ffmpeg -f alsa -ac 2 -ar 44100 -i pulse -f video4linux2 -framerate 30 -i /dev/video0 -framerate 30 -vcodec libx264 -acodec ac3 test4.mp4
-
-
录制桌面+摄像头
-
将摄像头拍摄到的画面叠加在录制到的桌面画面的右下角
-
-
$ ffmpeg -thread_queue_size 96 -f x11grab -video_size 1920x1080 -i :0.0 -f video4linux2 -video_size 400x300 -i /dev/video0 -filter_complex '[0:v][1:v]overlay=x=main_w-overlay_w-10:y=main_h-overlay_h-10[out]' -map '[out]' test5.mp4
-
-
这个任务消耗有点大,-thread_queue_size 必须设置一个比较大的值,要不然会看到 FFmpeg输出的日志信息中不停的提醒:[video4linux2,v4l2 @ 0x25fbc40] Thread message queue blocking; consider raising the thread_queue_size option (current value: 8),拍摄到的视频也会出现莫名其妙的错误,比如帧率很高,无法正常播放,视频不流畅等等。把 -thread_queue_size 设置为一个比较大的值,直到看不到该提示即可。
-
-
录制桌面+摄像头+麦克风
-
$ ffmpeg -thread_queue_size 128 -f x11grab -video_size 1920x1080 -framerate 30 -i :0.0 -f video4linux2 -video_size 400x300 -framerate 30 -i /dev/video0 -f alsa -ac 2 -i pulse -filter_complex '[0:v][1:v]overlay=x=main_w-overlay_w-10:y=main_h-overlay_h-10[out]' -map '[out]' -map 2:a -vcodec libx264 -acodec ac3 test6.mp4
-
和上面一样,注意给 -thread_queue_size 设置一个足够大的值。
-
-
推流命令:
-
$ ffmpeg -thread_queue_size 128 -f x11grab -video_size 1920x1080 -framerate 30 -i :0.0 -f video4linux2 -video_size 400x300 -framerate 30 -i /dev/video0 -f alsa -ac 2 -i pulse -filter_complex '[0:v][1:v]overlay=x=main_w-overlay_w-10:y=main_h-overlay_h-10[out]' -map '[out]' -map 2:a -vcodec libx264 -vprofile baseline -acodec aac -strict -2 -maxrate 3000k -b:a 128k -f flv rtmp://192.168.1.12:1935/myapp/stream2
https://www.cnblogs.com/wainiwann/p/4128154.html
常用参数说明:主要参数:
-i 设定输入流
-f 设定输出格式
-ss 开始时间
视频参数:
-b 设定视频流量,默认为200Kbit/s
-r 设定帧速率,默认为25
-s 设定画面的宽与高
-aspect 设定画面的比例
-vn 不处理视频
-vcodec 设定视频编解码器,未设定时则使用与输入流相同的编解码器
音频参数:
-ar 设定采样率
-ac 设定声音的Channel数
-acodec 设定声音编解码器,未设定时则使用与输入流相同的编解码器
-an 不处理音频
分离视频音频流
-
ffmpeg -i input_file -vcodec copy -an output_file_video //分离视频流, copy时最好后缀一致
-vcodec等同-codec:v -an 去掉音频的意思
-
ffmpeg -i input_file -acodec copy -vn output_file_audio //分离音频流
视频转码
-
ffmpeg –i test.mp4 –vcodec h264 –s 352*278 –an test.264 //转码为码流原始文件
-
ffmpeg –i test.mp4 –vcodec h264 –bf 0 –g 25 –s 352*278 –an test.264 //转码为码流原始文件
-
ffmpeg –i test.avi -vcodec mpeg4 –vtag xvid –qsame test_xvid.avi //转码为封装文件
-
//-bf B帧数目控制,-g 关键帧间隔控制,-s 分辨率控制
-
在H.264压缩标准中I帧、P帧、B帧用于表示传输的视频画面。
-
I帧
-
-
I帧又称帧内编码帧,是一种自带全部信息的独立帧,无需参考其他图像便可独立进行解码,可以简单理解为一张静态画面。视频序列中的第一个帧始终都是I帧,因为它是关键帧。
-
-
2、P帧
-
-
P帧又称帧间预测编码帧,需要参考前面的I帧才能进行编码。表示的是当前帧画面与前一帧(前一帧可能是I帧也可能是P帧)的差别。解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。与I帧相比,P帧通常占用更少的数据位,但不足是,由于P帧对前面的P和I参考帧有着复杂的依耐性,因此对传输错误非常敏感。
-
-
-
3、B帧
-
-
B帧又称双向预测编码帧,也就是B帧记录的是本帧与前后帧的差别。也就是说要解码B帧,不仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面的与本帧数据的叠加取得最终的画面。B帧压缩率高,但是对解码性能要求较高
视频封装
-
ffmpeg –i video_file –i audio_file –vcodec copy –acodec copy output_file
-
把音频和视频回合在一起。
视频剪切
-
ffmpeg –i test.avi –r 1 –f image2 image-%3d.jpeg //提取图片,每秒一帧
-
ffmpeg -ss 0:1:30 -t 0:0:20 -i input.avi -vcodec copy -acodec copy output.avi //剪切视频
-
//-r 提取图像的频率,-ss 开始时间,-t 持续时间
视频录制
-
ffmpeg –i rtsp://192.168.3.205:5555/test –vcodec copy out.avi
-
ffmpeg -f v4l2 -s 640*480 -i /dev/video0 camera.avi
-
把网络流或者摄像头的内容录制成视频
-
YUV序列播放
-
ffplay -f rawvideo -video_size 1920x1080 input.yuv
-
YUV序列转AVI
-
ffmpeg –s 640*480 –pix_fmt yuv420p –i input.yuv –vcodec mpeg4 output.avi
直播
-
将文件当做直播送至live
-
ffmpeg -re -i localFile.mp4 -c copy -f flv rtmp://server/live/streamName
-
-re:读输入按照原始帧率,否则默认会尽快的读入,re会降低读入帧率,一般用于实时流。
-
-c: -codec的简写 -c:v 代表 -vcodec 或者 -codec:v
-
将直播媒体保存至本地文件
-
ffmpeg -i rtmp://server/live/streamName -c copy dump.flv
-
将其中一个直播流,视频改用h264压缩,音频不变,送至另外一个直播服务流
-
ffmpeg -i rtmp://server/live/originalStream -c:a copy -c:v libx264 -vpre slow -f flv rtmp://server/live/h264Stream
-
-vpre 1080p -vpre slow: vpre代表让目标文件和原文采用相同的codec参数
-
将其中一个直播流,视频改用h264压缩,音频改用faac压缩,送至另外一个直播服务流
-
ffmpeg -i rtmp://server/live/originalStream -c:a libfaac -ar 44100 -ab 48k -c:v libx264 -vpre slow -vpre baseline -f flv rtmp://server/live/h264Stream
-
将一个高清流,复制为几个不同视频清晰度的流重新发布,其中音频不变
-
ffmpeg -re -i rtmp://server/live/high_FMLE_stream
-
-acodec copy -vcodec x264lib -s 640×360 -b 500k -vpre medium -vpre baseline rtmp://server/live/baseline_500k
-
-acodec copy -vcodec x264lib -s 480×272 -b 300k -vpre medium -vpre baseline rtmp://server/live/baseline_300k
-
-acodec copy -vcodec x264lib -s 320×200 -b 150k -vpre medium -vpre baseline rtmp://server/live/baseline_150k
-
-acodec libfaac -vn -ab 48k rtmp://server/live/audio_only_AAC_48k
-
将当前摄像头及音频通过DSSHOW采集,视频h264、音频faac压缩后发布
ffmpeg -r 25 -f v4l2 -s 640×480 -i /dev/video0\
-f alsa -ac 2 -i hw:0,0 \
-vcodec libx264 -b 600k -vpre slow \
-acodec libfaac -ab 128k \
-f flv rtmp://server/application/stream_name
USB camera 捕获
-
ffmpeg -t 10 -f v4l2 -i /dev/video0 -r 8 -f mp4 cap.mp4
具体说明如下:我们采集10秒,采集设备为v4l2类型,每秒8帧,输出方式为文件,格式为mp4。
最简单的抓屏:
ffmpeg -t 10 -f x11grab -video_size cif -framerate 25 -i :0.0 cap.mp4
从屏幕的(10,20)点处开始:
ffmpeg -f x11grab -video_size cif -framerate 25 -i :0.0+10,20 /tmp/out.mpg
-
ffmpeg从视频中生成gif图片
ffmpeg -i capx.mp4 -t 10 -s 320x240 -pix_fmt rgb24 jidu1.gif
阅读(5729) | 评论(0) | 转发(0) |