1 Star 4 Fork 1

shadaileng/nginx-rtmp

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README
WTFPL

构建镜像

# AMD64
$ sudo docker-compose build
# arm64
$ sudo docker-compose  -f docker-compose_arm.yaml build

运行

# AMD64
$ sudo docker-compose up -d
# arm64
$ sudo docker-compose  -f docker-compose_arm.yaml up -d

RTMP

  1. 直播

利用ffmpeg进行推流

# source: 本地视频文件名
# 192.168.10.108    : 服务器ip地址
# 8900  : rtmp监听端口,映射容器内的`1935`
ffmpeg -re -i <source>.mp4 -acodec copy -vcodec copy -f flv -an  rtmp://192.168.10.108:8900/live/a

利用vlc测试,地址: rtmp://192.168.10.108:8900/live/a

  • 192.168.10.108: 主机ip地址
  • 8900: rtmp监听端口,映射容器内的1935
  • a: 密文,与推流密文对应

  1. 点播

复制视频文件到vod点播目录

# source: 视频文件名
$ cp <source>.mp4 /var/www/hls

利用vlc测试: rtmp://192.168.10.108:8900/vod/<source>.mp4

  • 192.168.10.108: 主机ip地址
  • 8900: rtmp监听端口,映射容器内的1935
  • <source>.mp4: 视频文件

测试只有较短的视频才能实现rmtp点播

HTTP

  1. 点播
  • 将切片的ts文件和m3u8文件放在/www/hls_last目录下.
# source: 被切分的文件名
$ ffmpeg -i <source>.mp4 -codec:v libx264 -codec:a mp3 -map 0 -f ssegment -segment_format mpegts -segment_list <source>.m3u8 -segment_time 10 <source>_%03d.ts 
$ cp -r <source>* /www/hls_last
  • vlc输入[http://192.168.10.108:8800/hls_last/<video>.m3u8]即可看到点播视频
    • 192.168.10.108: 主机ip地址
    • 8800: http监听端口,,映射容器内的80
    • <video>.m3u8: 点播视频的m3u8

  1. 录播:

本地通过ffmpeg向服务器推流,在服务器的指定目录生成以<stream>命名的文件夹以及视频文件的切片和m3u8文件,1分钟之后删除切片文件

# source: 本地视频文件名
# 192.168.10.108    : 主机ip地址
# 8900  : rtmp监听端口,映射容器内的`1935`
# stream: 流
$ ffmpeg -re -i <source>.mp4 -vcodec libx264 -vprofile baseline -g 30 -acodec aac -strict -2 -f flv rtmp://192.168.10.108:8900/push/<stream>
  • vlc通过[http://192.168.10.108:8800/hls/<stream>/index.m3u8]进行点播
    • 192.168.10.108: 主机ip地址
    • 8800: http监听端口,映射容器内的80
    • <stream>: 推送视频时的stream
    • <video>.m3u8: 点播视频的m3u8

DASH

  1. 录播

服务端通过ffmpeg将源文件切片,然后将生成文件放入/www/dash_last文件夹

# INPUT_VIDEO: 源文件
# OUTPUT:输出文件名
$ ffmpeg -hide_banner -y -threads 0 -i INPUT_VIDEO -filter_complex 'split=2[s0][s1];[s0]scale=480:-2[480s];[s1]scale=360:-2[360s]' -map '[480s]' -c:v:0 libx264 -crf 25 -preset veryslow -map '[360s]' -c:v:1 libx264 -crf 27 -preset veryslow -map a -c:a:0 libfdk_aac -ar:a:0 22050 -map a -c:a:1 libfdk_aac -ar:a:1 44100 -g 150 -sc_threshold 0 -b_strategy 0 -min_seg_duration 5000 -use_timeline 0 -use_template 1 -single_file  1 -window_size 5 -adaptation_sets "id=0,streams=v id=1,streams=a" -f dash OUTPUT.mpd
# 如果没有安装libfdk_aac解码器,可以使用mp3替换
$ ffmpeg -hide_banner -y -threads 0 -i INPUT_VIDEO -filter_complex 'split=2[s0][s1];[s0]scale=480:-2[480s];[s1]scale=360:-2[360s]' -map '[480s]' -c:v:0 libx264 -crf 25 -preset veryslow -map '[360s]' -c:v:1 libx264 -crf 27 -preset veryslow -map a -c:a:0 mp3 -ar:a:0 22050 -map a -c:a:1 mp3 -ar:a:1 44100 -g 150 -sc_threshold 0 -b_strategy 0 -min_seg_duration 5000 -use_timeline 0 -use_template 1 -single_file  1 -window_size 5 -adaptation_sets "id=0,streams=v id=1,streams=a" -f dash OUTPUT.mpd
$ ffmpeg -i test.mp4 -c copy -f dash index.mpd
  • 使用vlc输入地址[http://192.168.10.108:8800/dash_last/OUTPUT.mpd]即可看到点播视频

或者使用以下脚本生成dash切片

#!/bin/bash
clean() {
	FILE_NAME=${1%.*}
    fm_list="320x180_500k 640x360_750k 640x360_1000k 1280x720_1500k"
    for item in ${fm_list[@]};do
        [ -e ${FILE_NAME}_video_${item}.mp4 ] && rm ${FILE_NAME}_video_${item}.mp4
        [ -e ${FILE_NAME}_video_${item}_f.mp4 ] && rm ${FILE_NAME}_video_${item}_f.mp4
    done
    [ -e ${FILE_NAME}_audio_128k.mp4 ] && rm ${FILE_NAME}_audio_128k.mp4
    [ -e ${FILE_NAME}_audio_128k_f.mp4 ] && rm ${FILE_NAME}_audio_128k_f.mp4
    [ -e output ] && rm -rf output
}

dash_file() {
	FILE_NAME=${1%.*}
    fm_list="320x180_500k 640x360_750k 640x360_1000k 1280x720_1500k"
    if [ ! -e ${FILE_NAME}.mp4 ]; then
        echo "${FILE_NAME}.mp4 not exists"
        exit 1
    fi

    begin=`date +%s`
    echo "------------------------------------------------------"
    for item in ${fm_list[@]};do
    {
#        echo ${item}  ${item%_*} ${item#*_}
#        echo "ffmpeg -i ${FILE_NAME}.mp4 -s ${item%_*} -c:v libx264 -b:v ${item#*_} -g 90 -an ${FILE_NAME}_video_${item}.mp4"
        ffmpeg -i ${FILE_NAME}.mp4 -s ${item%_*} -c:v libx264 -b:v ${item#*_} -g 90 -an ${FILE_NAME}_video_${item}.mp4
    }
#&
    done
#    wait
    ffmpeg -i ${FILE_NAME}.mp4 -c:a aac -b:a 128k -vn ${FILE_NAME}_audio_128k.mp4
    echo "------------------------------------------------------"
    end=`date +%s`
    echo -e "\033[47;30mdecoe video spend $((end-begin))s\033[0m"
    for item in `ls ${FILE_NAME}*k.mp4`;do
        mp4fragment ${item} ${item%.*}_f.mp4
    done
    mp4dash ${FILE_NAME}_*_f.mp4
}

if [ $# -lt 1 ];then
	echo "$0 input_file.mp4"
	exit 1
fi

clean ${1}
dash_file ${1}

需要安装Bento4,并设置环境变量

$ wget http://zebulon.bok.net/Bento4/binaries/Bento4-SDK-1-5-1-629.x86_64-unknown-linux.zip
$ unzip Bento4-SDK-1-5-1-629.x86_64-unknown-linux.zip
$ export PATH=$PATH:$(pwd)/Bento4-SDK-1-5-1-629.x86_64-unknown-linux/bin
# 使用脚本分片视频文件
$ bash dash_mp4.sh SOURCE.mp4

使用vlc输入地址[http://192.168.10.108:8800/dash_last/SOURCE/output/stream.mpd]即可看到点播视频


  1. 直播

本地通过ffmpeg向服务器推流,在服务器的指定目录生成以<stream>前缀的m4a, m4vmpd文件.

# source: 本地视频文件名
#  192.168.10.108: 主机ip地址
# 8900  : rtmp监听端口
# stream: 流
$ ffmpeg -re -i <source>.mp4 -vcodec libx264 -vprofile baseline -g 30 -acodec aac -strict -2 -f flv rtmp://192.168.10.108:8900/dash/<stream>
  • 使用vlc输入地址[rtmp://192.168.10.108:8900/dash/<stream>]即可看到点播视频
  • 使用vlc输入地址[http://192.168.10.108:8800/dash/<stream>.mpd]即可看到点播视频

hls离线下载管理网站

访问: http;//192.168.10.108:8800,192.168.10.108我为主机ip

# 安装本地环境
$ sudo pip3 install virtualenv -i https://pypi.douban.com/simple
$ virtualenv .venv
$ . .venv/bin/activate
$ pip3 install --upgrade pip -i https://pypi.douban.com/simple
$ pip3 install -r python/requirements.txt -i https://pypi.douban.com/simple
# 初始化
$ python python/www/db.py dev
$ sudo chmod 777 /data/demo.db
$ python python/www/hlsutils.py --july /root/july

参考

DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE Version 2, December 2004 Copyright (C) 2004 Sam Hocevar <sam@hocevar.net> Everyone is permitted to copy and distribute verbatim or modified copies of this license document, and changing it is allowed as long as the name is changed. DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. You just DO WHAT THE FUCK YOU WANT TO.

简介

nginx-rtmp实现的直播-点播服务器 展开 收起
README
WTFPL
取消

发行版

暂无发行版

贡献者

全部

近期动态

不能加载更多了
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/shadaileng/nginx-rtmp.git
git@gitee.com:shadaileng/nginx-rtmp.git
shadaileng
nginx-rtmp
nginx-rtmp
master

搜索帮助