protonemedia / laravel-ffmpeg

This package provides an integration with FFmpeg for Laravel. Laravel's Filesystem handles the storage of the files.
https://protone.media/en/blog/how-to-use-ffmpeg-in-your-laravel-projects
MIT License
1.63k stars 194 forks source link

how to put video's ts / m3u8 files with related video Id ? #440

Open magic-thomas opened 1 year ago

magic-thomas commented 1 year ago

I am try to use encrypted keys for HLS .

Followings are my m3u8 files.

// master.m3u8

#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=690800,RESOLUTION=1920x1080,CODECS="avc1.640028,mp4a.40.2",FRAME-RATE=23.976
master_0_500.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1240800,RESOLUTION=1920x1080,CODECS="avc1.640028,mp4a.40.2",FRAME-RATE=23.976
master_1_1000.m3u8
#EXT-X-ENDLIST
//master_1_1000.m3u8

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-KEY:METHOD=AES-128,URI="e300ec55b7e5dc7e.key",IV=0x75e185f74383141d2b771d7e6a9264f0
#EXTINF:10.010000,
master_1_1000_00000.ts
#EXT-X-KEY:METHOD=AES-128,URI="5d679d24c8676767.key",IV=0x75e185f74383141d2b771d7e6a9264f0
#EXTINF:10.010000,
master_1_1000_00001.ts
#EXT-X-KEY:METHOD=AES-128,URI="c1dcc5dd983d503a.key",IV=0x75e185f74383141d2b771d7e6a9264f0
#EXTINF:10.010000,

I want to separate all videos' ts/m3u8 files as their video_id directory.

I don't want to put all video's ts/m3u8 in just 1 directory.

I made this url

http://localhost::/video/{video_id} 

This url calls 'master_1_1000.m3u8' as mentioned.

And 'master_1_1000.m3u8' goes to http://localhost::/video/master_1_1000.m3u8 .

And it make '500 Internal Server Error'.

It should go to http://localhost::/video/{video_id}/master_1_1000.m3u8

How should I compose router for this ?

This is my current route.


Route::get('/video/secret/{video_id}/{key}', function ( $video_id,  $key ) {
    return Storage::disk('secrets')->download( $video_id . '/' .  $key);
})->name('video.key');

Route::get('/video/{video_id}', function ($video_id) {
    return FFMpeg::dynamicHLSPlaylist()
        ->fromDisk('public')
        ->open( $video_id . "/master.m3u8")
        ->setKeyUrlResolver(function ($key) use( $video_id) {
            return route('video.key', [
                'video_id'=> $video_id,
                'key' => $key
            ]);
        })
        ->setMediaUrlResolver(function ($mediaFilename) {
            return Storage::disk('public')->url("video/" . $mediaFilename);
        })
        ->setPlaylistUrlResolver(function ($playlistFilename) {
            return route('video.playlist', ['video_id' => $playlistFilename]);
        });
})->name('video.playlist');

Blog / youtube samples are not helpful.

Somebody can advise me ?