Всем привет, мы снова встретились, я ваш друг Цюаньчжаньцзюнь.
Самый простой способ,Просто используйте различные сетевые диски для поиска,Найдите общий адрес сетевого диска,Перенос на свой сетевой диск,затем скачайте。Это позволяет избежать необходимости онлайнвидеоПрямая загрузка с сайта,И часто четкость выше.
Если сетевой диск не может быть найден, второй метод — использовать некоторые веб-сайты онлайн-анализа видео. Введя URL-адрес видео, вы можете проанализировать адрес загрузки, что также очень просто. Крупные видеосайты, такие как Bilibili, Youku и т. д., имеют аналитические сайты. Однако современные видеосайты часто адаптируются, поэтому анализ часто не дает результатов.
Третий способ — использовать некоторые инструменты. Я обычно использую you-get и youtube-dl, оба написаны на Python и имеют открытый исходный код, и их можно изменить в соответствии с вашими потребностями. youtube-dl имеет более мощные функции и поддерживает больше веб-сайтов. Однако некоторые функции слишком громоздки и неудобны в использовании, например загрузка субтитров, выбор разрешения и т. д. you-get более удобен в этих аспектах, программа меньше по размеру и ее легче модифицировать.
Четвертый метод — напрямую просмотреть исходный код веб-страницы и найти адрес загрузки. Некоторые видеосайты, такие как Xigua Video, могут это сделать.
Пятый способ — попытаться получить список загрузок m3u8, а затем загрузить его. Если вы получили URL-адрес m3u8, вы можете использовать некоторые инструменты загрузки, специфичные для m3u8, чтобы загрузить его. Я попробовал один или два, но они не идеальны. Либо скорость слишком медленная, либо операция громоздкая.
Вы можете использовать youtube-dl для прямой загрузки: youtube-dl <m3u8изurl>。Удобство есть удобство,Но поскольку суть заключается в использовании ffmpeg для загрузки (по оценкам, некоторые из этих специальных инструментов загрузки m3u8 похожи на этот),Вероятно, однопоточный,Во-первых, скорость относительно низкая.,Во-вторых, если что-то пойдет не так,Приходится начинать заново. Поэтому я обычно загружаю файл m3u8 вручную, а затем использую инструменты загрузки, такие как Internet Download Manager, загружаю видеофайл, а затем с помощью ffmpeg собираю его в один файл. файл.
Загрузите файл m3u8 вручную. Если вы хотите полениться, вы можете напрямую ввести ffmpeg -protocol_whitelist file,http,https,tcp,tls,crypto -i index.m3u8 -c copy my_movie.ts в командной строке для загрузки. Преимущества и недостатки такие же, как указано выше, при использовании YouTube-DL Download m3u8 то же самое.
Если вы делаете это вручную, первым шагом будет загрузка файла m3u8. Существует довольно хороший инструмент — загрузчик hls плагина для браузера Chrome, который может автоматически захватывать URL-адрес m3u8, что более удобно в использовании. Некоторые URL-адреса невозможно захватить с помощью этого инструмента. Вам необходимо щелкнуть страницу «Сеть» в браузере Chrome, затем найти URL-адрес, содержащий m3u8, а затем загрузить его вручную. Отдельные веб-сайты также должны изучить исходный код js, чтобы найти содержимое m3u8. Например, веб-сайт не может найти m3u8 на странице «Сеть». После анализа js он находит функцию foo(e.data), а e.data содержит содержимое m3u8. Поэтому добавьте точку останова в функцию, обновите страницу, и когда точка останова остановится, введите console.log(e.data); в консоли будет напечатано m3u8.
Существует два основных типа загружаемых файлов m3u8. У одного полный плейлист, а у другого только адрес m3u8:
#EXTM3U #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1000000,RESOLUTION=1280×720 /foo/bar/index.m3u8
Для этого необходимо случайным образом найти URL-адрес видеоклипа на странице сети, например https://foo.com/1.ts, а затем объединить полный URL-адрес m3u8 https://foo.com/foo/bar/index. .m3u8, загрузите вручную, чтобы получить полный плейлист.
После получения списка воспроизведения сначала используйте программу, чтобы преобразовать его в файл списка, который можно легко импортировать с помощью инструмента загрузки:
private void m3u8toList()
{
StringBuilder sb = new StringBuilder();
var lines = File.ReadAllLines(@"C:\index.m3u8");
foreach (string line in lines)
{
if (line.IndexOf("#") < 0)
{
sb.AppendLine(line);
}
}
File.WriteAllText(@"C:\foo.txt", sb.ToString());
}
В плейлисте примерно два типа названий видеофайлов: одно обычное, например foo_001.ts, foo_002.ts и т. д., что более удобно, а другое нестандартное, например N3Atb.ts, 2BjMl.ts. и т. д. Это вызовет трудности при слиянии файлов на следующем шаге (если загружать напрямую с помощью ffmpeg, проблем не будет, а вот при ручной операции возникнут проблемы). Один из способов — использовать плагин DownthemAll и написать программу для создания специального списка загрузки:
var lines = File.ReadAllLines(@"C:\foo.txt");//Загрузить файл списка, по одному URL в строке
StringBuilder sb = new StringBuilder();
int count = 1;
sb.AppendLine("<?xml version=\"1.0\"?>");
sb.AppendLine("<metalink xmlns=\"urn:ietf:params:xml:ns:metalink\" version=\"4.0\" a0:version=\"3.0.8\" xmlns:a0=\"http://www.downthemall.net/properties#\">");
sb.AppendLine("<generator>DownThemAll!/3.0</generator>");
var date = (Int64)(DateTime.UtcNow .Subtract(new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)) .TotalMilliseconds);
var utcString = DateTime.UtcNow.ToString("r");
sb.AppendLine("<published>" + utcString + "</published>");
foreach (var line in lines)
{
string serial = String.Format("{0:0000}", count);
string url = line.Replace("&", "&").Replace(">", ">").Replace("<", "<").Replace("\"", """);
sb.AppendLine("<file name=\"" + serial + ".ts" + "\" a0:num=\"442\" a0:startDate=\"" + date.ToString() + "\" >");
sb.AppendLine("<url priority=\"100\" a0:usable=\"" + url + "\">" + url + "</url>");
sb.AppendLine("</file>");
date = date + 4;
count++;
}
sb.AppendLine("</metalink>");
File.WriteAllText(@"C:\downloadList.meta4", sb.ToString());
Однако, поскольку скорость загрузки в Downthemall невысока, я не часто использую этот метод. Обычно я сначала использую другие инструменты загрузки, чтобы загрузить видеофайл, а затем использую следующую программу для переименования файла:
private void renameDownloads()
{
var lines = File.ReadAllLines(@"C:\foo.txt");
int count = 1;
SortedList<string, string> mapping = new SortedList<string, string>();
int idx = 0;
foreach (var line in lines)
{
idx = line.LastIndexOf("/") + 1;
mapping.Add(line.Substring(idx), string.Format("{0:0000}", count) + ".ts");
count++;
}
var files = Directory.GetFiles(folder, "*.ts");
foreach (var file in files)
{
string fileName = Path.GetFileName(file);
File.Move(file, Path.Combine(folder, mapping[fileName]));
}
}
Некоторые видеофайлы в m3u8 зашифрованы, а скачанные ts-файлы невозможно открыть напрямую с помощью плеера. Обычно в файле есть разделы:
#EXT-X-KEY:METHOD=AES-128,URI=”https://foo.com/key.key”
В этом случае вам необходимо вручную загрузить файл key.key с этого URL-адреса, а затем использовать следующую программу для его расшифровки:
private void decrypt()
{
var folder = @"C:\foo";
byte[] encryptionKey = File.ReadAllBytes(@"C:\foo\key.key");
StringBuilder sberror = new StringBuilder();
var files = Directory.GetFiles(folder, "*.ts");
for (int i = 0; i < files.Length; i++)
{
string fileName = Path.GetFileName(files[i]);
string outputFile = Path.Combine(folder, Path.GetFileNameWithoutExtension(fileName) + ".mp4");
using (FileStream outputFileStream = new FileStream(outputFile, FileMode.Create))
{
byte[] encryptionIV = new byte[16];
using (FileStream inputFileStream = new FileStream(files[i], FileMode.Open))
{
try
{
using (var aes = new AesManaged { Key = encryptionKey, IV = encryptionIV, Mode = CipherMode.CBC })
using (var encryptor = aes.CreateDecryptor())
using (var cryptoStream = new CryptoStream(inputFileStream, encryptor, CryptoStreamMode.Read))
{
cryptoStream.CopyTo(outputFileStream);
}
}
catch (Exception ex)
{
sberror.AppendLine(fileName);
}
}
}
}
if (sberror.Length > 0)
{
File.WriteAllText(@"C:\foo\error1.txt", sberror.ToString());
MessageBox.Show("error");
}
}
Стоит отметить, что некоторые зашифрованные видео содержат незашифрованную рекламу. Обычно я удаляю эти объявления вручную, а затем расшифровываю их.
Последний шаг — объединить загруженные видеофайлы. Обычно я использую пакетный файл DOS для обработки:
for %%i in (*.ts) do echo file '%%i'>> t1.txt
pause
ffmpeg -f concat -safe 0 -i t1.txt -c copy final.mp4
Функция паузы – предоставить возможность ручной корректировки после формирования списка файлов. В некоторых случаях, например, если есть файлы 1.ts, 2.ts...10.ts, правильный порядок — от 1 до 10, но этот пакетный процесс может иметь ранг 10.ts после 1.ts, поэтому он необходима ручная регулировка.
Следует отметить, что некоторые файлы m3u8 имеют тег EXT-X-DISCONTINUITY, и иногда при слиянии с ffmpeg возникают ошибки. У меня нет хорошей идеи, я могу разделить видео только на два или три сегмента, что эквивалентно верхней и нижней частям или верхней, средней и нижней частям. Если количество сегментов не слишком велико, это так. все еще приемлемо.
Это общий метод загрузки.
Издатель: Лидер стека программистов полного стека, укажите источник для перепечатки: https://javaforall.cn/154252.html Исходная ссылка: https://javaforall.cn