Настраиваем потоковую передачу мультимедиа с использованием утилиты ffmpeg и протокола HLS
создаем файл /usr/local/sbin/hls-streaming.pl
#!/usr/bin/perl
=head1 NAME
hls-streaming.pl, version 1.0
=head1 DESCRIPTION
the script streams media files using HLS protocol
=head1 SYNOPSIS
hls-streaming.pl [option-1] ... [option-N]
=head1 OPTIONS
=over 8
=item --source
a path to files for streaming
=item --destination
a path to a folder for storing a playlist and segments
=item --name
a name of a playlist and segments
=item --url
a URL prefix for a playlist and segments (resulting URLs would look like <prefix>/<name>.m3u8 and <prefix>/<name><segment-number>.ts respectively)
=item --time
a segment duration (default - "10")
=item --count
a number of segments (default - "30")
=back
=head1 COPYRIGHT
(c) 2020 Alexander Galkov, [email protected]
=head1 LINK
www.galkov.pro/en/perl-script-for-hls-streaming-en
=cut
use strict;
use File::Find;
use Getopt::Long;
use Pod::Usage;
my $help;
my $source;
my $destination;
my $name;
my $url;
my $time = "10";
my $count = "30";
GetOptions ('help' => \$help,
'source=s' => \$source,
'destination=s' => \$destination,
'name=s' => \$name,
'url=s' => \$url,
'time:s' => \$time,
'count:s' => \$count);
if ($help)
{
pod2usage( { -verbose => 2 } );
}
else
{
my $address = "127.0.0.1";
my $port = 49152+int(rand(16384));
my $format = "%".length($count)."d";
my $pid = fork;
if ($pid==0)
{
while (1)
{
my @files;
find(sub { return unless -f; push(@files,$File::Find::name); }, $source);
my $cmd_1="ffmpeg -re -i \"@files[int(rand(scalar(@files)))]\" -vcodec copy -acodec copy -f mpegts udp://$address:$port > /dev/null 2>&1";
`$cmd_1`;
}
}
my $cmd_2="ffmpeg -i udp://$address:$port?buffer_size=10000000?fifo_size=100000 -vcodec copy -acodec copy -f ssegment -segment_list_flags +live -segment_time $time -segment_list_entry_prefix $url/ -segment_list_size $count -segment_wrap $count -segment_list \"$destination/$name.m3u8\" \"$destination/$name$format.ts\" > /dev/null 2>&1";
`$cmd_2`;
}
замечание: скрипт также можно скачать отсюда
создаем unit-файл /usr/lib/systemd/system/hls-streaming.service
[Unit]
Description=HLS Streaming
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/sbin/hls-streaming.pl --source /hls --destination /var/www/html --name stream --url http://hls.domain.lan
[Install]
WantedBy=multi-user.target
обновляем конфигурацию systemd
systemctl daemon-reload
запускаем службу
systemctl start hls-streaming
замечание: снизить нагрузки на дисковую подсистему можно подключив к конечной папке с сегментами RAM-диск:
mount -t tmpfs -o size=1G,rootcontext=system_u:object_r:httpd_sys_content_t:s0 tmpfs /var/www/html