Фон
Я хотел реализовать перекодирование по требованию определенных видеоформатов, таких как «.mkv», «.wmv», «.mov» и т. д., чтобы обслуживать их на сервере управления мультимедиа с помощью ASP.NET Core 6.0, C# и ffmpeg.
Мой подход
Подход, который я решил использовать, заключается в предоставлении динамически создаваемого файла .m3u8, который просто создается с использованием выбранной продолжительности сегмента, например 10 секунд и известная продолжительность видео. Вот как я это сделал. Обратите внимание, что решение в настоящее время не реализовано и отброшено:
публичная строка GenerateVideoOnDemandPlaylist(двойная длительность, сегмент int) { двойной интервал = (двойной) сегмент; вар содержимое = новый StringBuilder(); content.AppendLine("#EXTM3U"); content.AppendLine("#EXT-X-VERSION:6"); content.AppendLine(String.Format("#EXT-X-TARGETDURATION:{0}", сегмент)); content.AppendLine("#EXT-X-MEDIA-SEQUENCE:0"); content.AppendLine("#EXT-X-PLAYLIST-TYPE:VOD"); content.AppendLine("#EXT-X-INDEPENDENT-SEGMENTS"); for (двойной индекс = 0; (индекс * интервал) < длительность; индекс++) { content.AppendLine(String.Format("#EXTINF:{0:#.000000},", ((длительность - (индекс * интервал)) > интервал) ? интервал : ((длительность - (индекс * интервал)))) ); content.AppendLine(String.Format("{0:00000}.ts", index)); } content.AppendLine("#EXT-X-ENDLIST"); вернуть содержимое.ToString(); } [HttpGet] [Route("поток/{id}/{разрешение}.m3u8")] общедоступный поток IActionResult (идентификатор строки, разрешение строки) { двойная продолжительность = RetvieveVideoLengthInSeconds(); return Content(GenerateVideoOnDemandPlaylist(duration, 10), "application/x-mpegURL", Encoding.UTF8); } Вот пример того, как выглядит файл .m3u8:
#EXTM3U #EXT-X-ВЕРСИЯ:6 #EXT-X-TARGETDURATION:10 #EXT-X-MEDIA-SEQUENCE:0 #EXT-X-PLAYLIST-TYPE:VOD #EXT-X-НЕЗАВИСИМЫЕ-СЕГМЕНТЫ #EXTINF:10.000000, 00000.ц #EXTINF:3.386667, 00001.ц #EXT-X-ENDLIST Итак, игрок запросит 00000.ts, 00001.ts и т. д., и следующим шагом будет их создание по требованию:
public byte[] GenerateVideoOnDemandSegment(int индекс, int длительность, строковый путь) { интервал тайм-аута = 30000; ИНТ TotalWaitTime = 0; Интервал ожидания = 100; byte[] вывод = Array.Empty(); строка исполняемого файла = "/opt/homebrew/bin/ffmpeg"; DirectoryInfo temp = Directory.CreateDirectory(System.IO.Path.Combine(System.IO.Path.GetTempPath(), System.IO.Path.GetRandomFileName())); строковый формат = System.IO.Path.Combine(temp.FullName, "output-%05d.ts"); используя (Процесс ffmpeg = new()) { ffmpeg.StartInfo.FileName = исполняемый файл; ffmpeg.StartInfo.Arguments = String.Format("-ss {0} ", индекс * продолжительность); ffmpeg.StartInfo.Arguments += String.Format("-y -t {0} ", длительность); ffmpeg.StartInfo.Arguments += String.Format("-i \"{0}\" ", путь); ffmpeg.StartInfo.Arguments += String.Format("-c:v libx264 -c:a aac "); ffmpeg.StartInfo.Arguments += String.Format("-segment_time {0} -reset_timestamps 1 -break_non_keyframes 1 -map 0 ", продолжительность); ffmpeg.StartInfo.Arguments += String.Format("-initial_offset {0} ", индекс * продолжительность); ffmpeg.StartInfo.Arguments += String.Format("-f сегмент -segment_format mpegts {0}", format); ffmpeg.StartInfo.CreateNoWindow = правда; ffmpeg.StartInfo.UseShellExecute = ложь; ffmpeg.StartInfo.RedirectStandardError = ложь; ffmpeg.StartInfo.RedirectStandardOutput = ложь; ffmpeg.Старт(); делать { Thread.Sleep(waitInterval); TotalWaitTime + = интервал ожидания; } while ((!ffmpeg.HasExited) && (totalWaitTime
Бесшовное перекодирование отдельных сегментов HLS по требованию. ⇐ C#
Место общения программистов C#
-
Anonymous
1704437131
Anonymous
Фон
Я хотел реализовать перекодирование по требованию определенных видеоформатов, таких как «.mkv», «.wmv», «.mov» и т. д., чтобы обслуживать их на сервере управления мультимедиа с помощью [b]ASP.NET Core 6.0[/b], [b]C#[/b] и [b]ffmpeg[/b].
Мой подход
Подход, который я решил использовать, заключается в предоставлении динамически создаваемого файла .m3u8, который просто создается с использованием выбранной продолжительности сегмента, например 10 секунд и известная продолжительность видео. Вот как я это сделал. Обратите внимание, что решение в настоящее время не реализовано и отброшено:
публичная строка GenerateVideoOnDemandPlaylist(двойная длительность, сегмент int) { двойной интервал = (двойной) сегмент; вар содержимое = новый StringBuilder(); content.AppendLine("#EXTM3U"); content.AppendLine("#EXT-X-VERSION:6"); content.AppendLine(String.Format("#EXT-X-TARGETDURATION:{0}", сегмент)); content.AppendLine("#EXT-X-MEDIA-SEQUENCE:0"); content.AppendLine("#EXT-X-PLAYLIST-TYPE:VOD"); content.AppendLine("#EXT-X-INDEPENDENT-SEGMENTS"); for (двойной индекс = 0; (индекс * интервал) < длительность; индекс++) { content.AppendLine(String.Format("#EXTINF:{0:#.000000},", ((длительность - (индекс * интервал)) > интервал) ? интервал : ((длительность - (индекс * интервал)))) ); content.AppendLine(String.Format("{0:00000}.ts", index)); } content.AppendLine("#EXT-X-ENDLIST"); вернуть содержимое.ToString(); } [HttpGet] [Route("поток/{id}/{разрешение}.m3u8")] общедоступный поток IActionResult (идентификатор строки, разрешение строки) { двойная продолжительность = RetvieveVideoLengthInSeconds(); return Content(GenerateVideoOnDemandPlaylist(duration, 10), "application/x-mpegURL", Encoding.UTF8); } Вот пример того, как выглядит файл .m3u8:
#EXTM3U #EXT-X-ВЕРСИЯ:6 #EXT-X-TARGETDURATION:10 #EXT-X-MEDIA-SEQUENCE:0 #EXT-X-PLAYLIST-TYPE:VOD #EXT-X-НЕЗАВИСИМЫЕ-СЕГМЕНТЫ #EXTINF:10.000000, 00000.ц #EXTINF:3.386667, 00001.ц #EXT-X-ENDLIST Итак, игрок запросит [b]00000.ts[/b], [b]00001.ts[/b] и т. д., и следующим шагом будет их создание по требованию:
public byte[] GenerateVideoOnDemandSegment(int индекс, int длительность, строковый путь) { интервал тайм-аута = 30000; ИНТ TotalWaitTime = 0; Интервал ожидания = 100; byte[] вывод = Array.Empty(); строка исполняемого файла = "/opt/homebrew/bin/ffmpeg"; DirectoryInfo temp = Directory.CreateDirectory(System.IO.Path.Combine(System.IO.Path.GetTempPath(), System.IO.Path.GetRandomFileName())); строковый формат = System.IO.Path.Combine(temp.FullName, "output-%05d.ts"); используя (Процесс ffmpeg = new()) { ffmpeg.StartInfo.FileName = исполняемый файл; ffmpeg.StartInfo.Arguments = String.Format("-ss {0} ", индекс * продолжительность); ffmpeg.StartInfo.Arguments += String.Format("-y -t {0} ", длительность); ffmpeg.StartInfo.Arguments += String.Format("-i \"{0}\" ", путь); ffmpeg.StartInfo.Arguments += String.Format("-c:v libx264 -c:a aac "); ffmpeg.StartInfo.Arguments += String.Format("-segment_time {0} -reset_timestamps 1 -break_non_keyframes 1 -map 0 ", продолжительность); ffmpeg.StartInfo.Arguments += String.Format("-initial_offset {0} ", индекс * продолжительность); ffmpeg.StartInfo.Arguments += String.Format("-f сегмент -segment_format mpegts {0}", format); ffmpeg.StartInfo.CreateNoWindow = правда; ffmpeg.StartInfo.UseShellExecute = ложь; ffmpeg.StartInfo.RedirectStandardError = ложь; ffmpeg.StartInfo.RedirectStandardOutput = ложь; ffmpeg.Старт(); делать { Thread.Sleep(waitInterval); TotalWaitTime + = интервал ожидания; } while ((!ffmpeg.HasExited) && (totalWaitTime
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия