← Cloudflare Stream / stream / viewing-videos
Скачивание видео или аудио
При загрузке видео в Stream его можно транслировать через HLS/DASH. Однако для некоторых сценариев может понадобиться скачать файл MP4 или M4A. Например, для просмотра в офлайн-режиме удобнее скачать файл MP4. А для последующих задач, например для создания краткого содержания с помощью ИИ, если нужно извлечь только аудио, полезнее скачать файл M4A.
Создание файлов MP4 для скачивания
Вы можете включить поддержку MP4 для отдельных видео, выполнив следующие шаги:
- Включите поддержку MP4, отправив POST-запрос к
/downloadsили/downloads/defaultконечная точка. - Сохраните URL-адрес MP4-файла, который возвращает эндпоинт в ответе. Этот URL-адрес станет рабочим, когда MP4-файл будет готов на следующем шаге.
- Опрашивайте
/downloadsэндпоинт, покаstatusполе имеет значениеreadyчтобы сообщить о готовности MP4. Теперь вы можете использовать URL MP4 из шага 2.
Вы можете включить загрузку для загруженного видео, как только оно будет готово к просмотру, отправив HTTP-запрос к /downloads или /downloads/default конечная точка.
Чтобы получать уведомления о готовности видео к просмотру, см. Использование webhooks.
curl -X POST \
-H "Authorization: Bearer <API_TOKEN>" \
https://api.cloudflare.com/client/v4/accounts/<ACCOUNT_ID>/stream/<VIDEO_UID>/downloadsconst client = new Cloudflare({
apiEmail: process.env['CLOUDFLARE_EMAIL'],
apiKey: process.env['CLOUDFLARE_API_KEY'],
});
const download = await client.stream.downloads.create({
account_id: '<ACCOUNT_ID>',
identifier: '<VIDEO_UID>',
});Ответ включает тип загрузки, URL и статус обработки:
{
"result": {
"default": {
"status": "inprogress",
"url": "https://customer-<CODE>.cloudflarestream.com/<VIDEO_UID>/downloads/default.mp4",
"percentComplete": 75.0
}
},
"success": true,
"errors": [],
"messages": []
}Ознакомьтесь с полным Stream Справочник REST API и SDK для получения сведений об использовании REST API из внешних приложений: для TypeScript, Python и Go предусмотрены готовые SDK.
export default {
async fetch(request, env) {
const videoHandle = env.STREAM.video("VIDEO_ID");
const downloads = await videoHandle.downloads.generate();
return Response.json(downloads);
},
};{
"$schema": "node_modules/wrangler/config-schema.json",
"name": "<ENTER_WORKER_NAME>",
"main": "src/index.ts",
"compatibility_date": "$today",
"observability": {
"enabled": true
},
"stream": {
"binding": "STREAM"
}
}Ознакомьтесь с полным Справочник API привязки Workers Stream.
Создание файлов M4A для скачивания
Чтобы включить поддержку M4A для отдельного видео, выполните действия, похожие на генерацию загрузки MP4, но отправьте запрос POST на /downloads/audio конечная точка.
curl -X POST \
-H "Authorization: Bearer <API_TOKEN>" \
https://api.cloudflare.com/client/v4/accounts/<ACCOUNT_ID>/stream/<VIDEO_UID>/downloads/audioconst client = new Cloudflare({
apiEmail: process.env['CLOUDFLARE_EMAIL'],
apiKey: process.env['CLOUDFLARE_API_KEY'],
});
const download = await client.stream.downloads.audio.create({
account_id: '<ACCOUNT_ID>',
identifier: '<VIDEO_UID>',
});Ответ включает тип загрузки, URL и статус обработки:
{
"result": {
"audio": {
"status": "inprogress",
"url": "https://customer-<CODE>.cloudflarestream.com/<VIDEO_UID>/downloads/audio.m4a",
"percentComplete": 75.0
}
},
"success": true,
"errors": [],
"messages": []
}Ознакомьтесь с полным Stream Справочник REST API и SDK для получения сведений об использовании REST API из внешних приложений: для TypeScript, Python и Go предусмотрены готовые SDK.
export default {
async fetch(request, env) {
const videoHandle = env.STREAM.video("VIDEO_ID");
const downloads = await videoHandle.downloads.generate("audio");
return Response.json(downloads);
},
};{
"$schema": "node_modules/wrangler/config-schema.json",
"name": "<ENTER_WORKER_NAME>",
"main": "src/index.ts",
"compatibility_date": "$today",
"observability": {
"enabled": true
},
"stream": {
"binding": "STREAM"
}
}Ознакомьтесь с полным Справочник API привязки Workers Stream.
Получение ссылок для скачивания
Вы можете просмотреть все доступные загрузки для видео, выполнив GET HTTP-запрос к API загрузок.
curl -X GET \
-H "Authorization: Bearer <API_TOKEN>" \
https://api.cloudflare.com/client/v4/accounts/<ACCOUNT_ID>/stream/<VIDEO_UID>/downloadsconst client = new Cloudflare({
apiEmail: process.env['CLOUDFLARE_EMAIL'],
apiKey: process.env['CLOUDFLARE_API_KEY'],
});
const downloads = await client.stream.downloads.get({
account_id: '<ACCOUNT_ID>',
identifier: '<VIDEO_UID>',
});{
"result": {
"audio": {
"status": "ready",
"url": "https://customer-<CODE>.cloudflarestream.com/<VIDEO_UID>/downloads/audio.m4a",
"percentComplete": 100.0
}
"default": {
"status": "ready",
"url": "https://customer-<CODE>.cloudflarestream.com/<VIDEO_UID>/downloads/default.mp4",
"percentComplete": 100.0
}
},
"success": true,
"errors": [],
"messages": []
}Ознакомьтесь с полным Stream Справочник REST API и SDK для получения сведений об использовании REST API из внешних приложений: для TypeScript, Python и Go предусмотрены готовые SDK.
export default {
async fetch(request, env) {
const videoHandle = env.STREAM.video("VIDEO_ID");
const downloads = await videoHandle.downloads.get();
return Response.json(downloads);
},
};{
"$schema": "node_modules/wrangler/config-schema.json",
"name": "<ENTER_WORKER_NAME>",
"main": "src/index.ts",
"compatibility_date": "$today",
"observability": {
"enabled": true
},
"stream": {
"binding": "STREAM"
}
}Ознакомьтесь с полным Справочник API привязки Workers Stream.
Настройка имени файла загрузки
Вы можете задать имя загружаемых файлов, добавив filename параметр строки запроса в конце URL.
В примере ниже добавление ?filename=MY_VIDEO.mp4 к URL изменит имя файла на MY_VIDEO.mp4.
https://customer-<CODE>.cloudflarestream.com/<VIDEO_UID>/downloads/default.mp4?filename=MY_VIDEO.mp4
filename может содержать не более 120 символов и состоять из abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_ символов. Расширение (.mp4) добавляется автоматически.
Получение загрузок
Сформированные файлы MP4 для скачивания можно получить по ссылке в ответе download API.
curl -L https://customer-<CODE>.cloudflarestream.com/<VIDEO_UID>/downloads/default.mp4 > download.mp4Удаление загрузок
Вы можете удалить загрузку для видео. Доступные типы: default и audio. По умолчанию используется default если не указано.
curl -X DELETE \
-H "Authorization: Bearer <API_TOKEN>" \
https://api.cloudflare.com/client/v4/accounts/<ACCOUNT_ID>/stream/<VIDEO_UID>/downloads/defaultconst client = new Cloudflare({
apiEmail: process.env['CLOUDFLARE_EMAIL'],
apiKey: process.env['CLOUDFLARE_API_KEY'],
});
await client.stream.downloads.default.delete({
account_id: '<ACCOUNT_ID>',
identifier: '<VIDEO_UID>',
});Ознакомьтесь с полным Stream Справочник REST API и SDK для получения сведений об использовании REST API из внешних приложений: для TypeScript, Python и Go предусмотрены готовые SDK.
export default {
async fetch(request, env) {
const videoHandle = env.STREAM.video("VIDEO_ID");
await videoHandle.downloads.delete();
return new Response("Download deleted", { status: 200 });
},
};{
"$schema": "node_modules/wrangler/config-schema.json",
"name": "<ENTER_WORKER_NAME>",
"main": "src/index.ts",
"compatibility_date": "$today",
"observability": {
"enabled": true
},
"stream": {
"binding": "STREAM"
}
}Ознакомьтесь с полным Справочник API привязки Workers Stream.
Защищённая загрузка видео
Если ваше видео публичное, MP4-файл также будет общедоступен. Если видео приватное и требует подписанного URL для просмотра, MP4-файл не будет общедоступен. Чтобы получить доступ к MP4-файлу приватного видео, можно создать подписанный URL так же, как для обычного просмотра, добавив дополнительный флаг downloadable имеет значение true.
Вы можете создать подписанный токен с помощью Stream binding:
export default {
async fetch(request, env) {
const token = await env.STREAM.video("VIDEO_ID").generateToken();
return Response.json({ token });
},
};Ссылки для скачивания не будут работать для видео, которые уже требуют подписанных URL, если downloadable флаг отсутствует в токене.
Подробнее об использовании подписанных URL-адресов для видео см. в Защита Stream.
Пример полезной нагрузки токена
{
"sub": <VIDEO_UID>,
"kid": <KEY_ID>,
"exp": 1537460365,
"nbf": 1537453165,
"downloadable": true,
"accessRules": [
{
"type": "ip.geoip.country",
"action": "allow",
"country": [
"GB"
]
},
{
"type": "any",
"action": "block"
}
]
}Тарификация загрузки MP4
Загрузки MP4 оплачиваются так же, как и показ видео. За каждую загрузку MP4-файла видео взимается плата за его продолжительность. Например, если у вас есть 10-минутное видео, которое за месяц скачали 100 раз, эти загрузки будут учтены как 1000 минут по показателю «minutes served».
При включении MP4 дополнительная плата за хранение не взимается.