Ffmpeg

2017-12-29

流媒体相关记录

图片处理

用脚本批量压缩图片

脚本会把当前目录下所有jpg文件压缩并加编号

压缩jpg.bat

cd /d %~dp0
 
for %%a in (*.jpg) do (
    ffmpeg -i "%%~sa" -vf scale=iw/2:ih/2 -q 2 "%%~na_%%06d.jpg"
)

pause

参数说明:

-i        输入文件,这里指的就是视频文件。
-y        表示无需询问,直接覆盖输出文件(如果有原文件的话)。
-vf       应用滤镜。
scale     指的是缩放比例。
-q 2      表示存储jpeg的图像质量,一般2是高质量。如果为0,则使用 0级压缩质量,即不压缩。如果不指定q的值,则默认为8。

视频

NDI

Windows NDI

OBS https://obsproject.com/

OBS NDI 插件 https://github.com/Palakis/obs-ndi

Android NDI

NewTek-NDI-Apk https://apkshelf.com/newtek-ndi-apk

TriCaster Camera https://apkpure.com/cn/tricaster-camera/com.newtek.ndi.tccam

手机摄像头作为PC摄像头

Webcam 下载地址: https://iriun.com/

webcam支持USB调试模式直连,免费,4K,支持局域网无线。IOS 、安卓都兼容。

ffmpeg推流示例

ffmpeg 将/dev/video0设备的拍摄一张jpg保存到本地

ffmpeg -f video4linux2 -i /dev/video0 -vframes 1 image.jpg

windows 10 主机第二个摄像头

ffmpeg -f dshow -r 30 -rtbufsize 100M -video_size 320x240 -video_device_number 1 -i video="Integrated Webcam" -f mpegts -codec:v mpeg1video udp://192.168.0.21:5122

如果报错: real-time buffer [Integrated Webcam] [video input] too full or near too full

则添加:

-rtbufsize 512M    #该参数用于设置缓冲实时帧的最大内存,将内存加大可减轻这个问题发生

windows查看摄像头列表

ffmpeg -list_devices true -f dshow -i dummy

windows 桌面缩放

ffmpeg -f gdigrab -r 24 -i desktop -vf scale=320:240 -b 4000k -f mpegts -c:v mpeg1video udp://192.168.0.21:5122

-vf scale=320:240 vf 参数用于指定视频滤镜,其中 scale 表示缩放,后面的数字表示缩放至 320x240px

上面的参数 scale=320:240 当中的宽度和高度实际应用场景中通常只需指定一个,比如指定高度为 480 或者 720,至于宽度则可以传入 “-1” 表示由原始视频的宽高比自动计算而得。即参数可以写为:scale=-1:240,当然也可以 scale=320:-1

播放软件

1.VLC (跨平台)

官网: http://www.videolan.org/

注:kali linux 中无法打开VLC播放器的解决方法:

root@kali:~# vlc
VLC is not supposed to be run as root. Sorry.
If you need to use real-time priorities and/or privileged TCP ports
you can use vlc-wrapper (make sure it is Set-UID root and
cannot be run by non-trusted users first).

意思是VLC不能在root下面用.这个也是很好解决.需修改vlc的文件,执行

vim /usr/bin/vlc

然后找到geteuid,把这个字符串替换成getppid保存即可正常运行

2.OBS

官网:https://obsproject.com/

转码工具

1.FFmpeg

官网:http://ffmpeg.org/

查看支持的编码类型

ffmpeg -codecs | findstr "MP3"

ffmpeg -codecs | findstr "h264"

使用 -c:v 参数来指定视频的编解码器,这里 c 是 codec 的缩写,v 是指 video ,处理音频编码可以替换为 a ( audio )

比如把mp4转换成mp3时,这样指定 (测试下来mp3_mf编码器要比libmp3lame快):

ffmpeg -i input.mp4 -f mp3 -c:a mp3_mf output.mp3

ffmpeg 安装过程

下载

wget https://github.com/FFmpeg/FFmpeg/archive/n3.0.11.tar.gz
tar -zxvf n3.0.11.tar.gz

*新版安装:

wget https://ffmpeg.org/releases/ffmpeg-4.0.tar.bz2
tar -jxvf ffmpeg-4.0.tar.bz2 

先安装yasm

apt install yasm

进入安装目录

./configure --enable-shared --prefix=/usr/local/ffmpeg
make
make install

检查是否安装成功:

/usr/local/ffmpeg/bin/ffmpeg --version

报错如下:

/usr/local/ffmpeg/bin/ffmpeg: error while loading shared libraries: libavdevice.so.56: cannot open shared object file: No such file or directory

提示库文件找不到。

修改文件/etc/ld.so.conf 内容增加/usr/local/ffmpeg/lib/

vim /etc/ld.so.conf

include ld.so.conf.d/*.conf
/usr/local/ffmpeg/lib/

使修改生效

ldconfig

完成!

FFmpeg简介

FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证(依据你选择的组件)。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多codec都是从头开发的。

FFmpeg在Linux平台下开发,但它同样也可以在其它操作系统环境中编译运行,包括Windows、Mac OS X等。

FFmpeg项目由以下几部分组成:

  FFMpeg   视频文件转换命令行工具,也支持经过实时电视卡抓取和编码成视频文件。
  FFServer 基于HTTP(RTSP正在开发中)用于实时广播的多媒体服务器,也支持时间平移.
  FFplay   用SDL和FFmpeg库开发的一个简单的媒体播放器.
  libavcodec   一个包含了所有FFmpeg音视频编解码器的库.为了保证最优性能和高可复用性,大多数编解码器从头开发的.
  libavformat  一个包含了所有的普通音视格式的解析器和产生器的库.

查看支持的协议

ffmpeg -protocols

例子:ffmpeg -y -i “1.avi” -title “Test” -vcodec xvid -s 368x208 -r 29.97 -b 1500 -acodec aac -ac 2 -ar 24000 -ab 128 -vol 200 -f psp -muxvb 768 “output.wmv”

解释:以上命令可以在Dos命令行中输入,也可以创建到批处理文件中运行。不过,前提是:要在ffmpeg所在的目录中执行(转换君所在目录下面的cores子目录)。

输入输出文件通常就是待处理的多媒体文件了。可以是纯粹的音频文件,纯粹的视频文件,或者混合的。大部分常见的格式都能够“通杀”。象常见的各种mpeg,AVI封装的DIVX和Xvid等等,具体的格式支持列表可以使用ffmpeg -formats查看或直接查阅文档。 另:由于Linux把设备视为文件,因此-i选项后可以跟设备名。比如DV,视频卡,光驱或者其它的各类设备。

参数:

-y 覆盖输出文件,即如果 output.wmv 文件已经存在的话,不经提示就覆盖掉 
-i "1.avi" 输入文件是和ffmpeg在同一目录下的1.avi文件,可以自己加路径,改名字 
-title "Test" 在PSP中显示的影片的标题 
-vcodec xvid 使用XVID编码压缩视频,不能改的,对应的库为libxvid
-s 368x208 输出的分辨率为368x208,注意片源一定要是16:9的不然会变形 
-r 29.97 帧数,一般就用这个吧 
-b 1500 视频数据流量,用-b xxxx的指令则使用固定码率,数字随便改,1500以上没效果;还可以用动态码率如:-qscale 4和-qscale 6,4的质量比6高 
-acodec aac 音频编码用AAC 对应的库为libfaac
-ac 2  声道数1或2 
-ar 24000 声音的采样频率,好像PSP只能支持24000Hz 
-ab 128 音频数据流量,一般选择32、64、96、128 
-vol 200 200%的音量,自己改 
-muxvb 768 好像是给PSP机器识别的码率,一般选择384、512和768,我改成1500,PSP就说文件损坏了 
-f psp 输出psp专用格式 
"output.wmv" 输出文件名,也可以加路径改文件名

示例1: 截取一张352x240尺寸大小的,格式为jpg的图片: ffmpeg -i test.asf -y -f image2 -t 0.001 -s 352x240 a.jpg

示例2: 把视频的前30帧转换成一个Animated Gif : ffmpeg -i test.asf -vframes 30 -y -f gif a.gif

示例3: 在视频的第8.01秒处截取 352*240 的缩略图 ffmpeg -i test2.asf -y -f image2 -ss 08.010 -t 0.001 -s 352x240 b.jpg

a)通用选项

-L license

-h 帮助

-fromats 显示可用的格式,编解码的,协议的。。。

-f fmt 强迫采用格式fmt

-i filename 输入文件

-y 覆盖输出文件

-t duration 设置纪录时间 hh:mm:ss[.xxx]格式的记录时间也支持

-ss position 搜索到指定的时间 [-]hh:mm:ss[.xxx]的格式也支持

-title string 设置标题

-author string 设置作者

-copyright string 设置版权

-comment string 设置评论

-target type 设置目标文件类型(vcd,svcd,dvd) 所有的格式选项(比特率,编解码以及缓冲区大小)自动设置 ,只需要输入如下的就可以了: ffmpeg -i myfile.avi -target vcd /tmp/vcd.mpg

-hq 激活高质量设置

-itsoffset offset 设置以秒为基准的时间偏移,该选项影响所有后面的输入文件。该偏移被加到输入文件的时戳,定义一个正偏移意味着相应的流被延迟了 offset秒。 [-]hh:mm:ss[.xxx]的格式也支持

b) 视频选项

-b bitrate 设置比特率,缺省200kb/s

-r fps 设置帧频 缺省25

-s size 设置帧大小 格式为WXH 缺省160X128.下面的简写也可以直接使用: Sqcif 128X96 qcif 176X144 cif 252X288 4cif 704X576

-aspect aspect 设置横纵比 4:3 16:9 或 1.3333 1.7777

-croptop size 设置顶部切除带大小 像素单位

-cropbottom size –cropleft size –cropright size

-padtop size 设置顶部补齐的大小 像素单位

-padbottom size –padleft size –padright size –padcolor color 设置补齐条颜色(hex,6个16进制的数,红:绿:兰排列,比如 000000代表黑色)

-vn 不做视频记录

-bt tolerance 设置视频码率容忍度kbit/s

-maxrate bitrate设置最大视频码率容忍度

-minrate bitreate 设置最小视频码率容忍度

-bufsize size 设置码率控制缓冲区大小

-vcodec codec 强制使用codec编解码方式。 如果用copy表示原始编解码数据必须被拷贝。

-sameq 使用同样视频质量作为源(VBR)

-pass n 选择处理遍数(1或者2)。两遍编码非常有用。第一遍生成统计信息,第二遍生成精确的请求的码率

-passlogfile file 选择两遍的纪录文件名为file

c)高级视频选项

-g gop_size 设置图像组大小

-intra 仅适用帧内编码

-qscale q 使用固定的视频量化标度(VBR)

-qmin q 最小视频量化标度(VBR)

-qmax q 最大视频量化标度(VBR)

-qdiff q 量化标度间最大偏差 (VBR)

-qblur blur 视频量化标度柔化(VBR)

-qcomp compression 视频量化标度压缩(VBR)

-rc_init_cplx complexity 一遍编码的初始复杂度

-b_qfactor factor 在p和b帧间的qp因子

-i_qfactor factor 在p和i帧间的qp因子

-b_qoffset offset 在p和b帧间的qp偏差

-i_qoffset offset 在p和i帧间的qp偏差

-rc_eq equation 设置码率控制方程 默认tex^qComp

-rc_override override 特定间隔下的速率控制重载

-me method 设置运动估计的方法 可用方法有 zero phods log x1 epzs(缺省) full

-dct_algo algo 设置dct的算法 可用的有 0 FF_DCT_AUTO 缺省的DCT 1 FF_DCT_FASTINT 2 FF_DCT_INT 3 FF_DCT_MMX 4 FF_DCT_MLIB 5 FF_DCT_ALTIVEC

-idct_algo algo 设置idct算法。可用的有 0 FF_IDCT_AUTO 缺省的IDCT 1 FF_IDCT_INT 2 FF_IDCT_SIMPLE 3 FF_IDCT_SIMPLEMMX 4 FF_IDCT_LIBMPEG2MMX 5 FF_IDCT_PS2 6 FF_IDCT_MLIB 7 FF_IDCT_ARM 8 FF_IDCT_ALTIVEC 9 FF_IDCT_SH4 10 FF_IDCT_SIMPLEARM

-er n 设置错误残留为n 1 FF_ER_CAREFULL 缺省 2 FF_ER_COMPLIANT 3 FF_ER_AGGRESSIVE 4 FF_ER_VERY_AGGRESSIVE

-ec bit_mask 设置错误掩蔽为bit_mask,该值为如下值的位掩码 1 FF_EC_GUESS_MVS (default=enabled) 2 FF_EC_DEBLOCK (default=enabled)

-bf frames 使用frames B 帧,支持mpeg1,mpeg2,mpeg4

-mbd mode 宏块决策 0 FF_MB_DECISION_SIMPLE 使用mb_cmp 1 FF_MB_DECISION_BITS 2 FF_MB_DECISION_RD

-4mv 使用4个运动矢量 仅用于mpeg4

-part 使用数据划分 仅用于mpeg4

-bug param 绕过没有被自动监测到编码器的问题

-strict strictness 跟标准的严格性

-aic 使能高级帧内编码 h263+

-umv 使能无限运动矢量 h263+

-deinterlace 不采用交织方法

-interlace 强迫交织法编码 仅对mpeg2和mpeg4有效。当你的输入是交织的并且你想要保持交织以最小图像损失的时候采用该选项。可选的方法是不交织,但是损失更大

-psnr 计算压缩帧的psnr

-vstats 输出视频编码统计到vstats_hhmmss.log

-vhook module 插入视频处理模块 module 包括了模块名和参数,用空格分开

d)音频选项

-ab bitrate 设置音频码率

-ar freq 设置音频采样率

-ac channels 设置通道 缺省为1

-an 不使能音频纪录

-acodec codec 使用codec编解码

e)音频/视频捕获选项

-vd device 设置视频捕获设备。比如/dev/video0

-vc channel 设置视频捕获通道 DV1394专用

-tvstd standard 设置电视标准 NTSC PAL(SECAM)

-dv1394 设置DV1394捕获

-av device 设置音频设备 比如/dev/dsp

f)高级选项

-map file:stream 设置输入流映射

-debug 打印特定调试信息

-benchmark 为基准测试加入时间

-hex 倾倒每一个输入包

-bitexact 仅使用位精确算法 用于编解码测试

-ps size 设置包大小,以bits为单位

-re 以本地帧频读数据,主要用于模拟捕获设备

-loop 循环输入流。只工作于图像流,用于ffserver测试

注: mpeg1标准只允许几种不同的帧速率(23.976, 24.000, 25.000, 29.970, 30.000, 50.000, 59.940 and 60.000),但是你可以通过使用这个-strict -1选项来告诉ffmpeg忽略规范。

测试源

1,RTMP协议直播源 香港卫视:rtmp://live.hkstv.hk.lxdns.com/live/hks

2,RTSP协议直播源 大熊兔(点播):rtsp://184.72.239.149/vod/mp4://BigBuckBunny_175k.mov

3,HTTP协议直播源

香港卫视:http://live.hkstv.hk.lxdns.com/live/hks/playlist.m3u8
CCTV1高清:http://ivi.bupt.edu.cn/hls/cctv1hd.m3u8
CCTV3高清:http://ivi.bupt.edu.cn/hls/cctv3hd.m3u8
CCTV5高清:http://ivi.bupt.edu.cn/hls/cctv5hd.m3u8
CCTV5+高清:http://ivi.bupt.edu.cn/hls/cctv5phd.m3u8
CCTV6高清:http://ivi.bupt.edu.cn/hls/cctv6hd.m3u8
苹果提供的测试源(点播):http://devimages.apple.com.edgekey.net/streaming/examples/bipbop_4x3/gear1/prog_index.m3u8

更多http://ivi.bupt.edu.cn/

apple https://developer.apple.com/streaming/examples/

ffmpeg示例

windows下采集局部桌面

ffmpeg -f gdigrab -r 24 -offset_x 0 -offset_y 50 -video_size 640x480 -i desktop -b 4000k -f mpegts -c:v mpeg1video udp://192.168.1.59:5122/

截取窗口:

ffmpeg -f gdigrab -r 24 -i title="kali - root@kali: /home/test - Xshell 5 (Free for Home/School)" -b 4000k -f mpegts -c:v mpeg1video udp://192.168.1.59:5122/

注意:titile后面的标题必须完整名称,tasklist /v可能显示不全,请手动补全

获取窗口title

tasklist /V

windows下裁剪摄像头设备

ffmpeg -f dshow -i video="DroidCam Source 3" -f mpegts -c:v mpeg1video udp://192.168.1.59:5122/

windows下直接预览摄像头

ffplay -f dshow -i video="DroidCam Source 3"

注:除了使用DirectShow作为输入外,使用VFW也可以读取到摄像头的数据,例如下述命令可以播放摄像头数据:

ffplay -f vfwcap -i 0  

windows下查看所有设备

ffmpeg -list_devices true -f dshow -i 1

windows下直播画中画

ffmpeg -f gdigrab -r 24 -offset_x 0 -offset_y 50 -video_size 640x480 -i desktop -f dshow -i video="DroidCam Source 3" -filter_complex "[1:v]scale=w=176:h=144:force_original_aspect_ratio=decrease[ckout];[0:v][ckout]overlay=x=W-w-10:y=10[out]" -map "[out]" -s 320x240 -b 4000k -f mpegts -c:v mpeg1video udp://192.168.1.59:5122/

ERROR

报错:

> locale: Cannot set LC_CTYPE to default locale: No such file or directory
> locale: Cannot set LC_MESSAGES to default locale: No such file or directory
> locale: Cannot set LC_ALL to default locale: No such file or directory

解决办法:

apt update
apt install -y language-pack-zh-hans

$ cat /etc/default/locale
#  File generated by update-locale
LANG="en_US.UTF-8"
LANGUAGE="en_US:en"

locale -a
dpkg-reconfigure locales
# 使配置生效
locale-gen en_US.UTF-8

生成视频过大解决办法

使用huffyuv代替原始视频可能会更好 - 它会将您的文件大小减半,但是完全没有损失。使用,-c:v huffyuv而不是-c copy

官方文档:

http://ffmpeg.org/documentation.html

拷贝编译好的ffmpeg目录

ffmpeg目录存在各种.so链接库,如果直接scp会把links文件当做原文件拷贝,可以用rsync来解决:

rsync -Wav --progress linux:/usr/local/ffmpeg /usr/local/ffmpeg

改完后编辑 /etc/ld.so.conf 文件,在里面添加:

/usr/local/ffmpeg/lib

然后添加全局软链:

ln -s /usr/local/ffmpeg/bin/ffmpeg /usr/bin/ffmpeg

mjpg-streamer

mjpg-streamer是一个命令行应用程序,它将JPEG帧从一个或多个输入插件复制到多个输出插件。它可用于通过基于IP的网络将JPEG文件从网络摄像头流式传输到各种类型的查看器。