前端学习ffmpeg RTMP HLS协议记录

ffmpeg安装配置

需要准备linux环境,本人主要从事前端工作,一直没有接触过linux,从公司业务开始做音视频开发之后,发现少不了需要linux环境来搭建各种测试工具,于是就花高价租了阿里云。。。。

ffmpeg的安装放在了windows环境下

  1. ffmpeg官网下载对应的release版本,下载地址https://www.gyan.dev/ffmpeg/builds/
  2. 下载之后选择一个目录直接解压,并配置ffmpeg的环境变量
  3. 打开命令行 输入ffmpeg -version,输出ffmpeg版本即为配置成功

配置nginx-rtmp媒体服务器

先说一下我的理解,主要是先配置nginx服务器,nginx的配置就不多说了,不知道的可以查一下资料有很多。rtmp协议的配置主要借助于nginx的一个插件nginx-rtmp-module,在nginx启动好之后,修改nginx的配置文件,使nginx支持rtmp协议。

简单说一下自己对rtmp协议和HLS的理解

由于刚接触音视频领域,参与开发的项目不多,也只能作为前端人粗略的理解。
**RTMP(Real Time Messaging Protocol)**实时消息传输协议,底层是基于TCP的,所以在建立和断开音视频数据传输的时候需要进行三次握手和四次挥手,一定程度上耗费了时间。至于rtmp协议的格式和负载数据目前还不是很懂(希望后续能懂吧)。该协议由 adobe推出,目前已经不再维护更新,IOS不支持rtmp协议,可以用在推流端和拉流端。
**HLS(Http Live Streaming)**流媒体传输协议,由苹果公司推出,主要应用于移动端。本质是将多媒体文件切片,形成很多的ts文件和m3u8索引文件保存在磁盘中,在客户端进行播放的时候直接访问m3u8索引文件,只能用在拉流端。

nginx配置

以下均在linux环境下
nginx下载地址https://nginx.org/en/download.html
nginx-rtmp-module下载地址https://github.com/arut/nginx-rtmp-module.git
当nginx下载好之后,在nginx源码的位置执行以下命令

./configure --prefix=/usr/local/nginx --add-module=/usr/local/nginx-rtmp-module
make
make install

–prefix 安装在指定目录
–add-module 使用nginx-rtmp-module模块
执行完之后配置nginx.conf

rtmp {
		server {
			listen 1935;
			chunk_size 4096;

			# live on
			application rtmp_live {
				live on;
				# hls on; #这个参数把直播服务器改造成实时回放服务器。
				# wait_key on; #对视频切片进行保护,这样就不会产生马赛克了。
				# hls_path ./sbin/html; #切片视频文件存放位置。
				# hls_fragment 10s;     #每个视频切片的时长。
				# hls_playlist_length 60s;  #总共可以回看的时间,这里设置的是1分钟。
				# hls_continuous on; #连续模式。
				# hls_cleanup on;    #对多余的切片进行删除。
				# hls_nested on;     #嵌套模式。
			}
			application hls {
				live on;
				hls on;
				hls_path /usr/local/nginx/sbin/temp_hls/hls;
			}
			# play videos
			application rtmp_play{
				play ./videos;  #build directory
			}
		}
	}

RTMP协议默认使用的端口是1935

  1. application rtmp_live 这里我理解为相当于是一个应用接口,当我们用ffmpeg推流的时候往rtmp_live这个接口地址推,live on 表示开启直播
  2. 可以添加多个application,application hls 配置hls的接口,使用ffmpeg把多媒体流推送到hls这个接口上,就可以使用hls协议进行拉流了。(这里还需要在http server上加一下配置才可以使用hls协议)
location /hls { 
			# Serve HLS fragments 
			types { 
				application/vnd.apple.mpegurl m3u8; 
				video/mp2t ts; 
			} 
			root /usr/local/nginx/sbin/temp_hls; 
			add_header Cache-Control no-cache; 
		}
  1. play 参数相当于点播,把多媒体文件放在videos文件夹下就可以通过rtmp协议播放了
  2. 配置完成之后,重启nginx ./nginx -s reload
    说明:在rtmp server的配置中,我们配置了两个直播地址,一个用于rtmp一个用于hls,两个可以合并成一个,既支持rtmp又支持hls
rtmp {
		server {
			listen 1935;
			chunk_size 4096;

			# live on
			application live {
				live on;
				hls on; #这个参数把直播服务器改造成实时回放服务器。
				# wait_key on; #对视频切片进行保护,这样就不会产生马赛克了。
				hls_path /usr/local/nginx/sbin/temp_hls/hls; #切片视频文件存放位置。
				# hls_fragment 10s;     #每个视频切片的时长。
				# hls_playlist_length 60s;  #总共可以回看的时间,这里设置的是1分钟。
				# hls_continuous on; #连续模式。
				# hls_cleanup on;    #对多余的切片进行删除。
				# hls_nested on;     #嵌套模式。
			}
			# play videos
			application rtmp_play{
				play ./videos;  #build directory
			}
		}
	}

ffmpeg推流

1.使用ffmpeg推流,客户端采用hls形式拉流

ffmpeg -re -i test.mp4 -c copy -f flv rtmp://ip/hls/room8

推流一般都使用rtmp协议,hls对应注册的application hls,room8可以自定义,在拉流的时候对应 http://ip:port/hls/room8.m3u8
疑问:ffmpeg -f flv 应该推流到rtmp上的是flv格式,是哪里做的ts格式的转换??
隔天更新:在nginx-rtmp-module插件的内部模块有关于对hls切片的处理,参考文章:Nginx Rtmp Module - HLS切片和级联播放

1.ffmpeg推流
2.使用ffmpeg推流,客户端采用rtmp形式拉流

ffmpeg -re -i test.mp4 -c copy -f flv rtmp://ip/rtmp_live/mystream

在拉流的时候对应 rtmp://ip:port/rtmp_live/mystream

你可能感兴趣的:(javaScript,前端,学习,音视频,ffmpeg)