Настраиваем потоковую передачу мультимедиа с использованием утилиты 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

Добавить комментарий