مهرسا حیاتی
2 سال پیش توسط مهرسا حیاتی مطرح شد
1 پاسخ

پخش ویدیو با ffmpeg و لینک امن

@hesammosavi
@endworld
سلام خدمت همه دوستان
بنده فایل ویدیو هام رو با ffmpeg به m3u8 تبدیل میکنم و روی دیسک static که هاست دانلودم باشه آپلود کردم
وقتی هم که میخوام انارو توی blade لاراول نمایش بدم مشکلی ندارم اما بدون لینک امن

حالا از دوستان درخواست دارم کمکم کنید با استفاده از لینک امن اون ویدیو هارو نمایش بدم چیزی شبیه به همین سایت راکت مثلا:
https://dl4.roocket.ir/stream.m3u8?path=dlv/1398/laravel-project/17-advanced-search/165-filters-data/165-filters-data480p.m3u8&expires=1677764366&signature=3e302aedefa62b4414beba4957927afa
خودم بدون لینک امن اینکارو انجام دادم و خروجی گرفتم
اینا روت هاییه که تعریف کردم:

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

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

این هم source ویدیو :

<script src="https://cdn.rawgit.com/video-dev/hls.js/18bb552/dist/hls.min.js"></script>
    <script>
        document.addEventListener('DOMContentLoaded', () => {
            const source = "{{ route('video.playlist', ['playlist' => '29.m3u8']) }}";
            const video = document.querySelector('#video');

            const defaultOptions = {};

            if (!Hls.isSupported()) {
                video.src = source;
                var player = new Plyr(video, defaultOptions);
            } else {
                // For more Hls.js options, see https://github.com/dailymotion/hls.js
                const hls = new Hls();
                hls.loadSource(source);

                // From the m3u8 playlist, hls parses the manifest and returns
                        // all available video qualities. This is important, in this approach,
                        // we will have one source on the Plyr player.
                       hls.on(Hls.Events.MANIFEST_PARSED, function (event, data) {

                           // Transform available levels into an array of integers (height values).
                          const availableQualities = hls.levels.map((l) => l.height)
                      availableQualities.unshift(0) //prepend 0 to quality array

                          // Add new qualities to option
                    defaultOptions.quality = {
                        default: 0, //Default - AUTO
                        options: availableQualities,
                        forced: true,
                        onChange: (e) => updateQuality(e),
                    }
                    // Add Auto Label
                    defaultOptions.i18n = {
                        qualityLabel: {
                            0: 'Auto',
                        },
                    }

                    hls.on(Hls.Events.LEVEL_SWITCHED, function (event, data) {
                      var span = document.querySelector(".plyr__menu__container [data-plyr='quality'][value='0'] span")
                      if (hls.autoLevelEnabled) {
                        span.innerHTML = `AUTO (${hls.levels[data.level].height}p)`
                      } else {
                        span.innerHTML = `AUTO`
                      }
                    })

                     // Initialize new Plyr player with quality options
                     var player = new Plyr(video, defaultOptions);
                 });

            hls.attachMedia(video);
                window.hls = hls;
            }

            function updateQuality(newQuality) {
              if (newQuality === 0) {
                window.hls.currentLevel = -1; //Enable AUTO quality if option.value = 0
              } else {
                window.hls.levels.forEach((level, levelIndex) => {
                  if (level.height === newQuality) {
                    console.log("Found quality match with " + newQuality);
                    window.hls.currentLevel = levelIndex;
                  }
                });
              }
            }
        });
    </script>

اما اینا بدون لینک امنه و کاربر میتونه راحت به همه چی دسترسی داشته باشه میخوام مثل راکت لینک ویدیوها expires و امضا داشته باشه و نمایش بده که امن باشه
اگر کسی بلده لطفا رو همین کدهای خودم کمک برسونه اون لینک امن رو


ثبت پرسش جدید
سعید
تخصص : برنامه نویس وب
@Saeeed 2 سال پیش مطرح شد
0

@happy.b321d
سلام توی این داستان تجربه زیادی دارم و صفر تا صد رو هم کد زدم،
دوستان کسی خواست هم میتونم مشاوره بدم و هم سورس رو بفروشم
qmksbp@gmail.com
پاسخ کمتر از ۵ ساعت


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام