Configuração de serviço DASH para teste - mcalasans/dash_necos_ufu GitHub Wiki
Para compreensão do conceito de streaming adaptativo, recomenda-se a leitura do artigo Adaptive Streaming. Outras referências de apoio sobre o MPEG-DASH:
- MPEG-DASH
- How to encode Multi-bitrate videos in MPEG-DASH for MSE based media players - 1 e 2
- MPEG-DASH: GOP
Neste tutorial, considera-se o Ubuntu 16.04 como sistema operacional da máquina hospedeira e Virtualbox 5.2.10 instalado.
a) Criar a rede interna
- File-> Host Network Manager
- Clicar em Create
- Marcar DHCP Server
- Escolher a aba DHCP Server
- Server Address: 192.168.56.100
- Server Mask: 255.255.255.0
- Lower Address Bound: 192.168.56.101
- Upper Address Bound: 192.168.56.254
a) Baixar imagem do Ubuntu Server 16.04.
Exemplo:
wget http://ubuntu.c3sl.ufpr.br/releases/16.04.4/ubuntu-16.04.4-server-amd64.iso
b) Criar a máquina no Virtualbox
- Clicar em New
- Clicar em Expert Mode
- Configurar
- Name: DASHServer
- Type: Linux
- Version: Ubuntu 64 bits
- Memory: 512 MB
- Hard disk: Create a virtual hard disk now
- Clicar em Create
- Configurar:
- File location: DASHServer
- File size: 30 GB
- File type: VDI
- Storage on physical HD: Dynamically allocated
- Clicar em Create
- Clicar em Settings (com a VM selecionada)
- Clicar em Network -> Adapter 2
- Configurar:
- Enable Network Adapter (marcar)
- Attached to: Internal Network
- Clicar em Network -> Adapter 3
- Configurar:
- Enable Network Adapter (marcar)
- Attached to: Host-only Adapter
- Name: vboxnet0 (rede criada em I)
- Clicar em OK
c) Configurar a ISO de instalação do Ubuntu
- Clicar em Settings (com a VM selecionada)
- Clicar em Storage
- Selecionar o ícone do CD (empty) em Storage Devices
- Clicar no ícone do CD em Optical Drive
- Clicar em "Choose Virtual..."
- Selecionar a ISO e clicar em Open
- Marcar Live CD/DVD
- Clicar em OK
d) Instalar o Ubuntu
- Selecionar a VM DASHServer e clicar em Start
- Selecionar English
- Selecionar Install Ubuntu Server
- Language: English - English
- Location: Other -> South America -> Brazil
- Locales: United States - en_US.UTF-8
- Autodetect Keyboard: No
- Keyboard origin: Portuguese (Brazil)
- Keyboard layout: Portuguese (Brazil)
- Primary network: enp0s3
- Hostname: dashserver
- User: serveruser
- Username: serveruser
- Password:
- Homedir Encryption: No
- Clock: America/Sao_Paulo (Yes)
- Partition Method: Manual
- Partition Disks: (sda)
- Create new partition table: Yes
- Selecionar o espaço livre
- Create a new partition: "2GB" "primary" "beginning" "use as:swap" Done
- Selecionar o espaço livre
- Create a new partition: "30.2GB" "primary" "use as:Ext4..." "mount point:" Done
- Finish parttioning(...)
- Verificar e clicar em Yes
- Proxy:
- Tasksel: No automatic updates
- Software: standard system utilities; OpenSSH server;
- GRUB Install: Yes
- Finalizar a instalação clicando em Continue
Remover a ISO após instalação.
Obs.: Recomendável salvar uma cópia de segurança antes, clonando a máquina (desligada).
a) Atualizar os pacotes e instalar o unzip
sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade
sudo apt-get install unzip
b) Alterar o /etc/sudoers para não solicitar senha
sudo visudo
Incluir a seguinte linha no final do arquivo:
serveruser ALL=(ALL:ALL) NOPASSWD: ALL
Salvar como /etc/sudoers.
c) Alterar o /etc/inputrc para pesquisar o histórico com PgUp e PgDn
sudo vim /etc/inputrc
Descomentar as linhas (41 e 42):
"\e[5~": history-search-backward
"\e[6~": history-search-forward
Salvar o arquivo (:x) e logar novamente.
d) Configurar as interfaces no /etc/network/interfaces.
Obs.: Para saber o nome das interfaces use antes o comando ip link show
.
sudo vim /etc/network/interfaces
O arquivo deve incluir a configuração das três interfaces:
# NAT
# The primary network interface
auto enp0s3
iface enp0s3 inet dhcp
# Internal Network
auto enp0s8
iface enp0s8 inet static
address 172.16.0.10
netmask 255.255.255.0
network 172.16.0.0
broadcast 172.16.0.255
# Host-only
auto enp0s9
iface enp0s9 inet static
address 192.168.56.10
netmask 255.255.255.0
network 192.168.56.0
broadcast 192.168.56.255
Reiniciar o servidor:
sudo shutdown -r now
O restante do documento pode ser executado via ssh da máquina hospederia (192.168.56.1) para o servidor:
e) Instalar o Apache e configurar o MIME
Instalar o Apache:
sudo apt-get install apache2
Editar o arquivo mime.conf:
sudo vim /etc/apache2/mods-available/mime.conf
Incluir as linhas no local apropriado:
AddType application/dash+xml .mpd
AddType application/x-mpegURL .m3u8
AddType audio/aac .aac
AddType audio/mp4 .mp4 .m4a
AddType audio/mpeg .mp1 .mp2 .mp3 .mpg .mpeg
AddType audio/ogg .oga .ogg
AddType audio/wav .wav
AddType audio/webm .webm
AddType video/mp4 .mp4 .m4v
AddType video/ogg .ogv
AddType video/webm .webm
AddType video/MP2T .ts
Reiniciar configuração do apache:
sudo systemctl reload apache2
f) Instalar o ffmpeg
Se desejar remover pacotes existentes (instalações prévias):
rm -rf ~/ffmpeg_build ~/ffmpeg_sources ~/bin/{ffmpeg,ffprobe,ffserver,x265,nasm,ndisasm}
sed -i '/ffmpeg_build/d' ~/.manpath
hash -r
sudo apt-get autoremove autoconf automake build-essential checkinstall git libfaac-dev \
libgpac-dev libjack-jackd2-dev libopencore-amrnb-dev libopencore-amrwb-dev \
librtmp-dev libsdl1.2-dev libtheora-dev libva-dev libvdpau-dev libvorbis-dev \
libx11-dev libxfixes-dev pkg-config texi2html zlib1g-dev libass-dev cmake mercurial \
yasm libx264-dev libvpx-dev libfdk-aac-dev libmp3lame-dev libopus-dev
Baixar as dependencias:
sudo apt-get update
sudo apt-get -y install autoconf automake build-essential checkinstall git libfaac-dev \
libgpac-dev libjack-jackd2-dev libopencore-amrnb-dev libopencore-amrwb-dev \
librtmp-dev libsdl1.2-dev libtheora-dev libva-dev libvdpau-dev libvorbis-dev \
libx11-dev libxfixes-dev pkg-config texi2html zlib1g-dev libass-dev cmake mercurial
Criar os diretórios:
mkdir -p ~/ffmpeg_sources ~/bin
Instalar as bibliotecas:
- NASM (assembler):
cd ~/ffmpeg_sources && \
wget http://www.nasm.us/pub/nasm/releasebuilds/2.13.02/nasm-2.13.02.tar.bz2 && \
tar xjvf nasm-2.13.02.tar.bz2 && \
cd nasm-2.13.02 && \
PATH="$HOME/bin:$PATH" ./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin" && \
make && \
make install
- YASM (assembler) - v1.3.0-2
- libx264 (H.264 video encoder) - v148
- libvpx (VP8/VP9 video encoder and decoder) - v1.5.0-2
- libfdk-aac (AAC audio encoder) - v0.1.3
- libmp3lame (MP3 audio encoder) - v3.99.5
- libopus (Opus audio decoder and encoder) - v1.1.2
sudo apt-get install yasm libx264-dev libvpx-dev libfdk-aac-dev libmp3lame-dev libopus-dev
- libx265 (H.265/HEVC video encoder) - tem de ser compilada:
cd ~/ffmpeg_sources && \
if cd x265 2> /dev/null; then hg pull && hg update; else hg clone https://bitbucket.org/multicoreware/x265; fi && \
cd x265/build/linux && \
PATH="$HOME/bin:$PATH" cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX="$HOME/ffmpeg_build" -DENABLE_SHARED:bool=off ../../source && \
PATH="$HOME/bin:$PATH" make && \
make install
Instalar o ffmpeg:
cd ~/ffmpeg_sources && \
wget -O ffmpeg-snapshot.tar.bz2 http://ffmpeg.org/releases/ffmpeg-snapshot.tar.bz2 && \
tar xjvf ffmpeg-snapshot.tar.bz2 && \
cd ffmpeg && \
PATH="$HOME/bin:$PATH" PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" ./configure \
--prefix="$HOME/ffmpeg_build" \
--pkg-config-flags="--static" \
--extra-cflags="-I$HOME/ffmpeg_build/include" \
--extra-ldflags="-L$HOME/ffmpeg_build/lib" \
--extra-libs="-lpthread -lm" \
--bindir="$HOME/bin" \
--enable-gpl \
--enable-libass \
--enable-libfdk-aac \
--enable-libfreetype \
--enable-libmp3lame \
--enable-libopus \
--enable-libtheora \
--enable-libvorbis \
--enable-libvpx \
--enable-libx264 \
--enable-libx265 \
--enable-nonfree && \
PATH="$HOME/bin:$PATH" make && \
make install && \
hash -r
Maiores informações sobre a instalação do ffmpeg no Ubuntu podem ser obtidas no tutorial disponibilizado na página oficial.
g) Instalar o MP4Box
sudo apt install gpac
h) Obter arquivo de teste
O arquivo de teste utilizado está disponível aqui. O arquivo é utilizado apenas para fins acadêmicos e todos os direitos são reservados aos autores do vídeo, conforme especificado na página.
mkdir -p ~/videos/xiph && \
cd ~/videos/xiph && \
wget -O source.webm http://downloads.xiph.org/video/A_Digital_Media_Primer_For_Geeks-720p.webm
Como o vídeo está em formato WebM, ele precisará ser convertido para MP4:
ffmpeg -fflags +genpts -i source.webm -r 30 source.mp4
Para ver informações sobre o vídeo:
MP4Box -info source.mp4
ou
ffmpeg -i source.mp4
i) Gerar arquivo de áudio:
Extrair a faixa de audio e recodificá-la com dois canais (stereo) a 128, 64 e 32kps:
ffmpeg -i source.mp4 -c:a aac -ac 2 -b:a 128k -vn source-audio-128k.mp4 && \
ffmpeg -i source.mp4 -c:a aac -ac 2 -b:a 64k -vn source-audio-64k.mp4 && \
ffmpeg -i source.mp4 -c:a aac -ac 2 -b:a 32k -vn source-audio-32k.mp4
Onde
-i
= arquivo de entrada
-c:a
= codec de áudio
-ac
= número de canais
-vn
= desconsidera vídeo
-b:a
= bitrate de áudio
Para extrair a faixa de audio como é:
ffmpeg -i source.mp4 -c:a copy -vn source-audio.mp4
Maiores informações sobre o codec AAC podem sem obtidas aqui.
j) Gerar arquivos de vídeo:
Extrair os arquivos de vídeos e recodificá-los de quatro formas diferentes, variando a resolução, a taxa de bits e os frames por segundo, conforme informado abaixo:
Resolução | Fps | Bitrate |
---|---|---|
256x144 | 12 | 300k |
426x240 | 18 | 700k |
854x480 | 24 | 2100k |
1280x720 | 30 | 3760k |
Abaixo, algumas referências sobre escolha de resoluções de vídeo:
O tamanho do seguimento nas quatro versões é igual a 1s. Os comandos ffmpeg
correspondentes são apresentados a seguir:
ffmpeg -i source.mp4 -an -r 12 -c:v libx264 -x264opts 'keyint=12:min-keyint=12:no-scenecut' -b:v 300k -maxrate 300k -bufsize 150k -vf 'scale=256:144' source_256x144_12_300k.mp4 && \
ffmpeg -i source.mp4 -an -r 18 -c:v libx264 -x264opts 'keyint=18:min-keyint=18:no-scenecut' -b:v 700k -maxrate 700k -bufsize 350k -vf 'scale=426:240' source_426x240_18_700k.mp4 && \
ffmpeg -i source.mp4 -an -r 24 -c:v libx264 -x264opts 'keyint=24:min-keyint=24:no-scenecut' -b:v 2100k -maxrate 2100k -bufsize 1050k -vf 'scale=854:480' source_854x480_24_2100k.mp4 && \
ffmpeg -i source.mp4 -an -r 30 -c:v libx264 -x264opts 'keyint=30:min-keyint=30:no-scenecut' -b:v 3760k -maxrate 3760k -bufsize 1880k -vf 'scale=1280:720' source_1280x720_30_3760k.mp4
Onde,
-i
= arquivo de entrada
-an
= desconsidera áudio
-r
= taxa de quadros/segundo (fps)
-c:v
= codec de vídeo
-x264opts
= configura parâmetros x264 como uma lista de parametro=valor separados por dois pontos (:)
keyint
= tamanho máximo do GOP (group of pictures; distancia entre I-frames)
min-keyint
= tamanho mínimo do GOP
no-scenecut
= desabilita completamente decisão adaptativa de quadros I-frame
keyint=X:min-keyint=X:no-scenecut
= força o codificador a usar um GOP de tamanho constante
-b:v
= taxa de bits (bitrate) de vídeo
-maxrate
= taxa de bits máxima em qualquer ponto do vídeo. Requer que o tamanho do buffer seja configurado
-bufsize
= tamanho do buffer em bits
-vf
= filtro de vídeo
scale
= resolução do vídeo
Maiores informações sobre o codec H.264 podem ser obtidas aqui. Outras informações sobre parâmetros e codificações de vídeo nos links abaixo:
- Understanding Rate Control Modes (x264, x265, vpx)
- FFmpeg - Limiting the output bitrate
- FFmpeg - Filtering Guide
- FFmpeg Codecs Documentation
- x264 FFmpeg Options Guide
- FFmpeg Command Options
l) Gerar os arquivos de manifesto
Gerar o arquivo de manifesto utilizando como entradas os arquivos de áudio e vídeo gerados anteriormente:
MP4Box -dash 1000 -rap -frag-rap -profile onDemand -out source-mp4.mpd source_256x144_12_300k.mp4 source_426x240_18_700k.mp4 source_854x480_24_2100k.mp4 source_1280x720_30_3760k.mp4 source-audio-128k.mp4 source-audio-32k.mp4
Onde,
-dash
= duração do segmento em milisegundos
-rap
= força o segmento a começar cum um pontos de acesso aleatórios
-frag-rap
= todos os fragmentos começarão com pontos de acesso aleatórios
-profile
= perfil MPEG-DASH (configura valores opcionais padrões para o perfil desejado)
-out
= arquivo de manifesto criado
Maiores informações sobre os parâmetros MP4Box podem ser encontradas aqui.
m) Baixar o DASH.js
O melhor player para teste é o DASH.js:
cd /var/www/html && sudo wget "https://cdn.dashjs.org/latest/dash.all.min.js"
n) Configurar o index.html
cd /var/www/html && sudo mv index.html index.html.def && \
sudo ln -s /home/serveruser/videos /var/www/html/ && \
sudo vim index.html
Incluir o conteúdo:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title> DASHServer - Exemplo </title>
<script src="dash.all.min.js"></script>
</head>
<body>
<h2> DASHServer - Exemplo de vídeo adaptativo </h2>
<div>
<video data-dashjs-player autoplay src="videos/xiph/source-mp4.mpd" controls></video>
</div>
</body>
</html>
Salvar e fechar o arquivo (:x). Recarregar o apache2:
sudo systemctl reload apache2
o) Testar no navegador
Acessar o endereço 192.168.56.10 no navegador.