Stream
Video yükleme, kodlama, depolama, canlı yayın ve oynatıcı tek API'de. Yalnızca iki boyutta faturalanıyor: saklanan dakika ve teslim edilen dakika — yükleme ve kodlama ücretsiz.
- DurumGenel kullanımda
- FiyatSaklanan dakika (ön ödemeli) + teslim edilen dakika (kullanım sonrası)
- Doğrulama
Stream nedir?
“Cloudflare Stream lets you or your end users upload, store, encode, and deliver live and on-demand video with one API, without configuring or maintaining infrastructure.” “Stream automatically encodes and delivers videos using the H.264 codec with adaptive bitrate streaming, supporting resolutions from 360p to 1080p.”
Video işinin normalde ayrı ayrı çözülen beş parçası — depolama, kodlama, paketleme, dağıtım ve oynatıcı — tek bir API’nin arkasında. Canlı yayında bunun anlamı daha da büyük: Cloudflare’in kendi ifadesiyle “live video must be re-encoded in real-time into multiple resolutions… running a fleet of virtual machines doesn’t come cheap.”
“R2’ye bir MP4 koysam olmaz mı?”
Bu sorunun cevabı çoğu zaman olur — ve bunu söyleyen Cloudflare’in kendisi:
“For customers with a huge volume of short video, such as generative AI output, e-commerce product videos, social media clips, or short marketing content, uploading those assets to Stream is not always practical. Furthermore, Stream’s key features like adaptive bitrate encoding and HLS packaging offer diminishing returns on short content or small files.”
| Durum | Doğru araç |
|---|---|
| Kısa klip, ürün videosu, AI çıktısı, sosyal medya kesiti | R2 + Media Transformations |
| Uzun form içerik, adaptif bitrate ihtiyacı | Stream |
| Canlı yayın, DVR, kayıt | Stream |
| Altyazı, imzalı erişim, ülke bazlı kısıt | Stream |
Maliyet tarafında bir not daha: “Video stored in Stream does not incur additional storage fees from other storage products such as R2.”
Nasıl çalışır?
Yükleme yolları
| Yöntem | Ne zaman |
|---|---|
| Panel | Kod yazmadan |
Bağlantıdan (/stream/copy) | Video zaten R2, S3 veya GCS’te |
| Doğrudan POST | 200 MB altı, güvenilir bağlantı |
| tus | 200 MB üstü — zorunlu; ya da bağlantı güvenilmezse |
| Direct Creator Upload | Son kullanıcı kendi videosunu yüklüyor |
Kabul edilen kaynak formatlar: MP4, MKV, MOV, AVI, FLV, MPEG-2 TS, MPEG-2 PS, MXF, LXF, GXF, 3GP, WebM, MPG, QuickTime. Dosya 30 GB’ın altında olmalı.
Önerilen girdi: “MP4 containers, AAC audio codec, H264 video codec, 60 or fewer frames per second.” Kare hızı serbest ama “Stream re-encodes videos for a maximum of 90 FPS playback” ve değişken kare hızlı içerikte fazla kareler düşürülüyor.
Canlı yayın
Akış dört adımda işliyor: her yayın için bir live input oluşturuluyor, her input’un bir Stream Key’i oluyor, yayıncı RTMPS veya SRT ile bağlanıyor, Cloudflare çoklu çözünürlükte kodlayıp izleyiciye dağıtıyor.
rtmps://live.cloudflare.com:443/live/<STREAM_KEY>
SRT’nin farkı: “SRT supports newer video codecs and makes using accessibility features, such as captions and multiple audio tracks, easier.” Ama tek modda — “Stream only supports the SRT caller mode.”
Live input’un dikkat edilmesi gereken parametreleri:
| Parametre | Varsayılan | Not |
|---|---|---|
recording.mode | off | automatic yapmazsan kayıt olmuyor ve HLS/DASH ile izlenemiyor |
enabled | true | false yapmak yayıncının bağlantısını reddediyor — yayını programatik bitirmenin yolu |
preferLowLatency | false | LL-HLS beta; recording.mode da automatic olmalı |
deleteRecordingAfterDays | null | Minimum 30, maksimum 1.096 gün |
timeoutSeconds | 0 | Kopma ne kadar sürerse yeni bir video oluşacağını belirliyor |
Gecikme — belgelenmiş rakamlar
| Yol | Gecikme |
|---|---|
| WebRTC (WHIP/WHEP) | “sub-second”, “less than 500 milliseconds” |
| RTMPS/SRT playback (native uygulama) | “glass-to-glass latency of less than 1 second” |
| LL-HLS (Beta) | “as little as three seconds” — öncesi “highs of around 30 seconds to less than 10” |
| Standart HLS/DASH | Yayımlanmış rakam yok |
Oynatma
<iframe src="https://customer-<CODE>.cloudflarestream.com/<VIDEO_UID>/iframe"
style="border: none" height="720" width="1280"
allow="accelerometer; gyroscope; autoplay; encrypted-media; picture-in-picture;"
allowfullscreen="true"></iframe>
Kendi oynatıcını kullanacaksan:
https://customer-<CODE>.cloudflarestream.com/<UID>/manifest/video.m3u8
https://customer-<CODE>.cloudflarestream.com/<UID>/manifest/video.mpd
https://customer-<CODE>.cloudflarestream.com/<UID>/manifest/video.m3u8?protocol=llhls
Oynatıcı parametreleri querystring ile veriliyor: autoplay, controls, muted, loop,
preload, poster, primaryColor, letterboxColor, startTime (?startTime=1h12m27s
biçimini de kabul ediyor), defaultTextTrack, ve reklam için ad-url (VAST tag). Renk ve
poster değerleri URI-encoded olmalı. Hata ayıklama menüsü: video oynarken Shift-D.
Erişim kontrolü
requireSignedURLs açıldığında “This option will prevent any public links… from working.”
Token üretmenin üç yolu var ve seçim ölçeğe bağlı:
| Yol | Ne zaman |
|---|---|
/token uç noktası | “recommended for testing purposes or if you are generating less than 1,000 tokens per day”. Varsayılan ömür 1 saat. Live WebRTC’yi desteklemiyor ve hız sınırına tabi. |
| Signing key | “If you have thousands of daily users or need to generate a high volume of tokens… this is therefore not a rate-limited operation.” |
| Workers Stream binding | env.STREAM.video("VIDEO_ID").generateToken() |
Token içinde exp (“Cannot be greater than 24 hours in the future”), accessRules (en fazla
5 kural; IP ve ISO ülke kodu ile) ve downloadable alanları var. Ayrıca allowedOrigins
ile hotlink engellenebiliyor — ama kuralı bilmek şart: “example.com does not cover
www.example.com or any subdomain of example.com” ve “There is no path support.”
Ne zaman kullanılır, ne zaman kullanılmaz
Uygun olduğu işler
- Uzun form video kütüphanesi — kurs, konferans kaydı, arşiv
- Canlı yayın: RTMPS/SRT girdi, otomatik ABR, otomatik kayıt, 50 hedefe simulcast
- Kullanıcı yüklemeli video (Direct Creator Upload) — API token’ı istemciye vermeden
- Ülke veya IP bazlı erişim kısıtı gereken içerik
- Altyazı gereken içerik — Türkçe dahil,
trkodu belgelenmiş
Uygun olmadığı işler
- Kısa ve küçük klipler. Cloudflare’in kendi ifadesiyle ABR ve HLS paketlemesi bu içerikte azalan getiri veriyor; R2 + Media Transformations daha doğru.
- Orijinal dosyayı geri istemek. Yüklediğin dosya geri verilmiyor.
- HDR teslim. Yüklenen HDR video SDR’a yeniden kodlanıyor.
- Chromium. “Cloudflare Stream is not available on Chromium, as Chromium does not support H.264 videos.”
- DRM gerektiren içerik. Belgelenmemiş — imzalı URL ve erişim kuralları var, DRM yok.
- Canlıda watermark. “Watermarks cannot yet be used with live videos.”
- Türkiye’de veri yerelleştirme. Uyumluluk matrisinde Stream, Regional Services için ✘.
Somut örnekler
1. R2’deki bir videoyu Stream’e almak
curl -X POST \
-H "Authorization: Bearer $CF_API_TOKEN" \
-d '{"url":"https://depo.ornek.com/tanitim.mp4","meta":{"name":"Tanıtım videosu"}}' \
"https://api.cloudflare.com/client/v4/accounts/$CF_ACCOUNT_ID/stream/copy"
2. tus ile büyük dosya
tus-upload --chunk-size 52428800 \
--header Authorization "Bearer $CF_API_TOKEN" \
./konferans-kaydi.mp4 \
"https://api.cloudflare.com/client/v4/accounts/$CF_ACCOUNT_ID/stream"
Upload-Metadata ile geçilebilen anahtarlar: name, requiresignedurls, scheduleddeletion,
allowedorigins, thumbnailtimestamppct, watermark. Yükleyeni işaretlemek için
Upload-Creator başlığı.
3. Kayıtlı canlı yayın açmak
curl -X POST \
-H "Authorization: Bearer $CF_API_TOKEN" \
-d '{"meta":{"name":"webinar"},"recording":{"mode":"automatic"},"deleteRecordingAfterDays":30}' \
"https://api.cloudflare.com/client/v4/accounts/$CF_ACCOUNT_ID/stream/live_inputs"
recording.mode varsayılanı off — bunu yazmazsan yayın kaydedilmiyor ve HLS/DASH ile
izlenemiyor.
4. Ülke bazlı erişim kuralı
{
"exp": 1788300000,
"accessRules": [
{ "type": "ip.geoip.country", "action": "allow", "country": ["TR"] },
{ "type": "any", "action": "block" }
]
}
En fazla 5 kural; sıra önemli ve son kural genellikle catch-all oluyor.
5. Thumbnail ve hareketli önizleme
.../thumbnails/thumbnail.jpg?time=12s&height=270&fit=crop
.../thumbnails/thumbnail.gif?time=12s&height=200&duration=4s&fps=8
“Viewing animated thumbnails does not count toward billed minutes delivered.” Ama bir kısıt var: “Stream thumbnails are not supported for videos with non-square pixels.”
6. Anahtar rotasyonu
curl -X POST -H "Authorization: Bearer $CF_API_TOKEN" \
"https://api.cloudflare.com/client/v4/accounts/$CF_ACCOUNT_ID/stream/live_inputs/$INPUT_ID/rotate_keys"
“old credentials are revoked, broadcasts using stale credentials are disconnected, and refreshed credentials are returned in the API response.”
Demo 1: Ubuntu’dan canlı yayın ve codec hatasını üretmek
Ön koşullar: Ubuntu sunucu, ffmpeg, jq, Stream aboneliği olan bir Cloudflare hesabı.
sudo apt update && sudo apt install -y ffmpeg jq curl
export CF_ACCOUNT_ID="<hesap-id>"
export CF_API_TOKEN="<Stream:Edit yetkili token>"
Adım 1 — Live input oluştur
curl -s -X POST \
-H "Authorization: Bearer $CF_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"meta":{"name":"ubuntu-demo"},"recording":{"mode":"automatic"}}' \
"https://api.cloudflare.com/client/v4/accounts/$CF_ACCOUNT_ID/stream/live_inputs" \
| tee /tmp/input.json | jq '{uid:.result.uid, rtmps:.result.rtmps.url, key:(.result.rtmps.streamKey[0:12]+"…")}'
export INPUT_UID=$(jq -r '.result.uid' /tmp/input.json)
export STREAM_KEY=$(jq -r '.result.rtmps.streamKey' /tmp/input.json)
Adım 2 — Doğru codec ile yayın aç
ffmpeg -re -f lavfi -i testsrc2=size=1280x720:rate=30 \
-f lavfi -i sine=frequency=440:sample_rate=48000 \
-c:v libx264 -preset veryfast -tune zerolatency -b:v 3000k -maxrate 3000k -bufsize 6000k \
-pix_fmt yuv420p -g 120 -keyint_min 120 -sc_threshold 0 \
-c:a aac -b:a 128k -ar 48000 -ac 2 \
-f flv "rtmps://live.cloudflare.com:443/live/$STREAM_KEY"
Parametrelerin karşılıkları: -g 120 -keyint_min 120 -sc_threshold 0 → 30 fps’te 4 saniyelik
sabit closed GOP (zorunluluk); -c:v libx264 → H.264 (zorunluluk); -c:a aac → AAC
(zorunluluk); -b:v 3000k → 12 Mbps’in çok altında (öneri).
Adım 3 — Yayının canlıya geçtiğini doğrula
Başka bir bölmede:
CODE=$(curl -s -H "Authorization: Bearer $CF_API_TOKEN" \
"https://api.cloudflare.com/client/v4/accounts/$CF_ACCOUNT_ID/stream/live_inputs/$INPUT_UID" \
| jq -r '.result.uid')
curl -s "https://customer-$CUSTOMER_CODE.cloudflarestream.com/$INPUT_UID/lifecycle" | jq .
curl -s "https://customer-$CUSTOMER_CODE.cloudflarestream.com/$INPUT_UID/views" | jq .
lifecycle çıktısında "live": true ve bir videoUID görmelisin.
Adım 4 — Tarayıcıda izle
https://customer-<CODE>.cloudflarestream.com/<INPUT_UID>/watch
Adım 5 — Belgelenmiş hatayı üret: desteklenmeyen codec
Ctrl+C ile durdur, sonra MP3 ses ve VP8 video ile dene — ikisi de belgelenmiş
zorunlulukları ihlal ediyor:
ffmpeg -re -f lavfi -i testsrc2=size=640x360:rate=30 \
-f lavfi -i sine=frequency=440 \
-c:v libvpx -b:v 1000k -c:a libmp3lame -b:a 128k \
-f flv "rtmps://live.cloudflare.com:443/live/$STREAM_KEY"
Bağlantı kuruluyor ama yayın izlenebilir hâle gelmiyor. lifecycle live: false kalıyor.
Adım 6 — Değişken keyframe aralığını da sına
# -g ve -sc_threshold YOK: x264 sahne degisimine gore keyframe koyar
ffmpeg -re -f lavfi -i testsrc2=size=1280x720:rate=30 -f lavfi -i sine=frequency=440 \
-c:v libx264 -preset veryfast -b:v 3000k -pix_fmt yuv420p \
-c:a aac -b:a 128k -ar 48000 \
-f flv "rtmps://live.cloudflare.com:443/live/$STREAM_KEY"
# Uretilen akisin keyframe araligini olc
ffprobe -v error -select_streams v -show_entries frame=key_frame,pts_time \
-of csv=p=0 -read_intervals '%+20' /tmp/ornek.flv | grep '^1' | head
Adım 7 — Kaydı doğrula ve temizle
Doğru yayını 2–3 dakika akıtıp durdur, sonra:
sleep 70
curl -s -H "Authorization: Bearer $CF_API_TOKEN" \
"https://api.cloudflare.com/client/v4/accounts/$CF_ACCOUNT_ID/stream/live_inputs/$INPUT_UID/videos" \
| jq '.result[] | {uid, status:.status.state, duration, created}'
Kayıt “within 60 seconds after a live stream ends” hazır oluyor.
# Temizlik
curl -s -X DELETE -H "Authorization: Bearer $CF_API_TOKEN" \
"https://api.cloudflare.com/client/v4/accounts/$CF_ACCOUNT_ID/stream/live_inputs/$INPUT_UID"
Demo 2: İmzalı URL ve ülke kuralını Türkiye’den kanıtlamak
Bu demo iki şeyi aynı karede gösteriyor: erişim kuralının çalıştığı, ve isteğin gerçekten Türkiye’den, İstanbul PoP’undan gittiği.
Adım 1 — Videoyu imzalı hâle getir
export VID="<video-uid>"
curl -s -X POST -H "Authorization: Bearer $CF_API_TOKEN" \
-H "Content-Type: application/json" -d '{"uid":"'"$VID"'"}' \
"https://api.cloudflare.com/client/v4/accounts/$CF_ACCOUNT_ID/stream/$VID" \
--data '{"requireSignedURLs": true}' | jq '.result.requireSignedURLs'
# Imzasiz erisimin kapandigini kanitla
curl -s -o /dev/null -w "imzasiz: %{http_code}\n" \
"https://customer-$CUSTOMER_CODE.cloudflarestream.com/$VID/manifest/video.m3u8"
Adım 2 — İmzalama anahtarı üret
curl -s -X POST -H "Authorization: Bearer $CF_API_TOKEN" \
"https://api.cloudflare.com/client/v4/accounts/$CF_ACCOUNT_ID/stream/keys" \
| tee /tmp/key.json | jq '{id:.result.id}'
Yanıttaki PEM’i sakla — bir daha gösterilmiyor.
Adım 3 — Türkiye’yi engelleyen token üret
pip install --quiet pyjwt cryptography
python3 - <<'PY'
import jwt, json, time, base64, os
d = json.load(open('/tmp/key.json'))['result']
pem = base64.b64decode(d['pem']).decode()
payload = {
"sub": os.environ["VID"],
"kid": d["id"],
"exp": int(time.time()) + 3600,
"accessRules": [
{"type": "ip.geoip.country", "action": "block", "country": ["TR"]},
{"type": "any", "action": "allow"},
],
}
print(jwt.encode(payload, pem, algorithm="RS256", headers={"kid": d["id"]}))
PY
Adım 4 — Türkiye’den dene ve iki şeyi birden kanıtla
export BLOCKTOK="<uretilen-jwt>"
curl -s -o /dev/null -w 'TR''den: http=%{http_code}\n' \
"https://customer-$CUSTOMER_CODE.cloudflarestream.com/$BLOCKTOK/manifest/video.m3u8"
curl -s https://speed.cloudflare.com/meta | jq '{country: .country, colo: .colo, ip: .clientIp}'
Adım 5 — Tersini kanıtla
Aynı betiği "action": "allow", "country": ["TR"] ve sondaki kuralı {"type":"any","action":"block"}
yapıp tekrar çalıştır — bu kez 200 dönmeli.
Adım 6 — Hotlink engelini kur
curl -s -H "Authorization: Bearer $CF_API_TOKEN" -H "Content-Type: application/json" \
--data "{\"uid\":\"$VID\",\"allowedOrigins\":[\"ornek.com\"]}" \
"https://api.cloudflare.com/client/v4/accounts/$CF_ACCOUNT_ID/stream/$VID" \
| jq '.result.allowedOrigins'
curl -s -o /dev/null -w "yabanci origin: %{http_code}\n" \
-H "Origin: https://baska-site.com" \
"https://customer-$CUSTOMER_CODE.cloudflarestream.com/$VID/manifest/video.m3u8"
curl -s -o /dev/null -w "dogru origin: %{http_code}\n" \
-H "Origin: https://ornek.com" \
"https://customer-$CUSTOMER_CODE.cloudflarestream.com/$VID/manifest/video.m3u8"
Adım 7 — Faturaya etkisini gör
Panel: Stream → Analytics. Bu demonun ürettiği Minutes Delivered rakamına bak.
Ölçüm tablosu
| Ölçüt | Değer |
|---|---|
Doğru codec ile lifecycle.live | |
Yanlış codec ile lifecycle.live | |
| Yayın başından oynatılabilir hâle gelene kadar geçen süre | |
| Kaydın hazır olma süresi | |
| İmzasız istek HTTP kodu | |
TR block kuralıyla HTTP kodu + colo | |
TR allow kuralıyla HTTP kodu + colo | |
allowedOrigins yabancı / doğru origin sonucu | |
| Demoda üretilen Minutes Delivered |
Fiyatlandırma
Rakamlar 1 Eylül 2026’da Stream pricing
sayfasından alındı; workers.cloudflare.com/pricing, ürün sayfası ve Stream Live dokümanı
aynı rakamları veriyor — dört resmî kaynak tutarlı.
“Stream bills on two dimensions only: Minutes of video stored… Minutes of video delivered… Ingress (sending your content to us) and encoding are always free. Bandwidth is already included in ‘video delivered’ with no additional egress (traffic/bandwidth) fees.”
| Metrik | Fiyat | Model |
|---|---|---|
| Minutes stored | 5 USD / 1.000 dakika | Ön ödemeli |
| Minutes delivered | 1 USD / 1.000 dakika | Kullanım sonrası |
Depolama tüketenler: yüklenen orijinal videolar, RTMP/SRT canlı yayın kayıtları, ve
tamamlanmamış Direct Creator / tus yüklemeleri için ayrılan maxDurationSeconds.
Depolama tüketmeyenler: hatalı veya oynatılamaz videolar, süresi dolmuş Direct Creator linkleri, silinen videolar, MP4 indirme için üretilen dosyalar, ve Stream’in her orijinal için ürettiği çoklu kalite seviyeleri.
Cloudflare’in kendi örneği: iki kişi otuz dakikalık bir videoyu izlerse “This will result in 60 minutes of Minutes Delivered usage (or $0.06).”
Media Transformations — aynı kotayı paylaşıyor
Stream dışındaki videoları dönüştürmek (/cdn-cgi/media/…) Stream metriklerinden değil,
Images kotasından yiyor:
“Media Transformations and Image Transformations use the same subscriptions and usage metrics.” “Generating a still frame (single image) from a video counts as 1 transformation.” “Generating an optimized video or extracting audio counts as 1 transformation per second of the output content.” “All Media and Image Transformations cost $0.50 per 1,000 monthly unique transformation operations, with a free monthly allocation of 5,000.”
Sınırları: girdi en fazla 100 MB ve 10 dakika; çıktı boyutu 10–2000 piksel; duration
1s–60s; time 0–10m. Ve “Media Transformations are not compatible with Bring Your Own
IP (BYOIP).”
Lisanslama ve hukuki çerçeve
Stream tescilli bir hizmettir ve Cloudflare Hizmet Şartlarına tabidir.
Veri yerelleştirme — Stream için yol yok. Data Localization uyumluluk matrisi:
| Ürün | Geo Key Manager | Regional Services | Customer Metadata Boundary |
|---|---|---|---|
| Stream | ⚫️ uygulanamaz | ✘ Not compatible | 🚧 ¹ |
| Stream Delivery | ✅ | ✅ | ✅ |
¹ “Logs / Analytics not available outside US region when using Customer Metadata Boundary.”
Saklama ve silme. Abonelik yenilenmezse “Videos are removed if the subscription is not
renewed within 30 days.” Otomatik silme için scheduleddeletion veya
deleteRecordingAfterDays kullanılıyor — ikisi de minimum 30, maksimum 1.096 gün.
Analitik saklama. GraphQL Analytics API için: tek sorguda en fazla 31 günlük aralık, veri saklama 90 gün.
Altyazı ve erişilebilirlik. WebVTT zorunlu, dil kodu BCP 47. Türkçe için Cloudflare’in kendi
tablosunda tr kodu açıkça listelenmiş — erişilebilirlik yükümlülüğü olan kurumsal projeler için
kullanılabilir bir dayanak.
Sık yapılan hatalar
recording.mode değerini yazmamak
Varsayılan off. Bunu automatic yapmazsan yayın kaydedilmiyor ve HLS/DASH ile
izlenemiyor — yayın canlıda görünse bile.
Değişken keyframe aralığı bırakmak
OBS ve benzeri araçlarda varsayılan çoğu zaman otomatik. Cloudflare sabit değer istiyor: “change it to a specific value such as four seconds.” Bu, “Connected ama izlenemiyor” arızasının bir numaralı sebebi.
AAC yerine başka bir ses codec’i göndermek
“Stream Live only supports H.264 video and AAC audio codecs as inputs.” MP3 gönderirsen bağlantı kurulur ama yayın izlenebilir hâle gelmez.
Manifest’i önbelleğe almak
Manifest dinamik. Kendi CDN’inde tutarsan segment formatı değiştiğinde 404 almaya başlarsın.
Location başlığından video ID ayrıştırmak
stream-media-id başlığını kullan.
allowedOrigins’in alt alan adlarını kapsadığını sanmak
ornek.com yazmak www.ornek.com’u kapsamıyor, ve yol desteği hiç yok.
Direct Creator Upload rezervasyonunu hesaba katmamak
maxDurationSeconds değeri anında depolamandan düşülüyor. Cömert bir değer verip çok sayıda
link açarsan kotanı kullanılmayan rezervasyonlarla doldurabilirsin.
Yedi günden uzun yayın yapmak
“If a live video exceeds seven days in length, the recording will be truncated to seven days.”
Kısa klipler için Stream kullanmak
ABR ve HLS paketlemesi kısa içerikte azalan getiri veriyor, ama depolama ve teslim faturası işlemeye devam ediyor. R2 + Media Transformations daha uygun.
Sıkça sorulan sorular
- Yüklediğim orijinal dosyayı geri indirebilir miyim?
- Hayır. Birebir: “You cannot download the exact input file that you uploaded. However… you can use the Downloadable Videos feature to get encoded MP4s for use cases like offline viewing.” Yani indirilebilir dosya alıyorsun ama o senin yüklediğin dosya değil, Stream'in ürettiği MP4.
- Maksimum video boyutu ve eşzamanlı yükleme sınırı nedir?
- Birebir: “By default, a video upload can be at most 30 GB” ve “you can have up to 120 videos queued or being encoded simultaneously. Videos in the
error,ready, orpendinguploadstate do not count toward this limit.” Aşarsan 429 veya 413 dönüyor. - 200 MB'dan büyük dosyayı nasıl yüklerim?
- tus zorunlu. Birebir: “If you need to upload a video that is over 200 MB, you must use the tus protocol. Even if the video is under 200 MB, if your connection is potentially unreliable, Cloudflare recommends using the tus protocol.” Chunk kuralları: minimum 5.242.880 bayt, maksimum 209.715.200 bayt, ve 256 KiB'nin katı olmalı (son parça muaf). Güvenilir bağlantıda önerilen 52.428.800 bayt. Bir tuzak: video ID'yi
Locationbaşlığından ayrıştırma — “it is not recommended to parse this URL to get the ID. Instead, you should use thestream-media-idHTTP header.” - Fiyat nasıl işliyor, bant genişliği ayrı mı faturalanıyor?
- İki boyut var, üçüncü yok. Birebir: “Stream bills on two dimensions only: Minutes of video stored… Minutes of video delivered… Ingress (sending your content to us) and encoding are always free. Bandwidth is already included in 'video delivered' with no additional egress (traffic/bandwidth) fees.” Saklama ön ödemeli (5 USD / 1.000 dakika), teslim kullanım sonrası (1 USD / 1.000 dakika).
- Büyük dosya daha mı pahalı?
- Hayır — süre önemli, boyut değil. Birebir: “The cost to store a video is based only on its duration, not its file size” ve “Storage consumption is rounded up to the second of video duration; file size does not matter.” Ayrıca depolama tüketmeyen şeyler var: hatalı videolar, süresi dolmuş Direct Creator linkleri, silinen videolar, MP4 indirme için üretilen dosyalar ve Stream'in her video için ürettiği çoklu kalite seviyeleri.
- Kimse izlemezken canlı yayın yapmak ne kadar tutar?
- Birebir: “A live broadcast with no viewers will cost $0 for minutes delivered, but the recording of the broadcast will count toward minutes of video stored.” Ve kodlama tarafı ücretsiz: “All Stream Live videos are automatically recorded. There is no additional cost for encoding and packaging live videos.”
- Oynatıcının ön yüklemesi faturalanıyor mu?
- Evet. Birebir: “Delivery is counted by HTTP requests for video segments or parts of the MP4. Therefore: Client-side preloading and buffering is counted as billable delivery.” Tarayıcı önbelleğinden oynatılan içerik faturalanmıyor — ama uyarı da var: “Some mobile app player libraries do not cache HLS segments by default.” Yuvarlama segment uzunluğuna göre: yüklenen içerikte 4 saniye, canlıda yayının GOP boyutuna göre.
- Depolamam biterse ne olur?
- Birebir: “If you run out of storage, you will not be able to upload new videos or start new live streams until you purchase more storage or delete videos.” Enterprise için istisna var: “Enterprise customers may continue to upload new content beyond their contracted quota without interruption.” Canlı tarafta bu durum
ERR_STORAGE_QUOTA_EXHAUSTEDwebhook'u olarak geliyor. - Direct Creator Upload depolamamı hemen tüketiyor mu?
- Evet, rezervasyon olarak. Birebir: “you must specify a maximum duration to reserve for the user's upload… This duration will be deducted from your account's available storage until the user's upload is received. Once the upload is processed, its actual duration will be counted and the remaining reservation will be released.” Cloudflare'in örneği: 600 saniyelik bir link açarsan 10 dakika anında düşülüyor; kullanıcı 5 dakikalık video yüklerse kalan 5 dakika serbest kalıyor; link kullanılmadan dolarsa tamamı geri veriliyor.
- Aboneliğimi iptal edersem videolarım ne olur?
- Birebir: “Videos are removed if the subscription is not renewed within 30 days.”
- Canlı yayın için hangi codec ve ayarlar zorunlu?
- Üç zorunluluk var ve ihlali sessiz arızaya yol açıyor. (1) “Stream Live only supports H.264 video and AAC audio codecs as inputs.” (2) “Closed GOPs are required.” (3) “Clients must be configured to reconnect when a disconnection occurs.” Öneriler: GOP 2–8 saniye, CBR, bitrate “typically well under 12Mbps”. LL-HLS kullanıyorsan ek olarak: “Turn off B Frames or set them to 0. B Frames are incompatible with LL-HLS and will result in jitter and sporadic buffering delays” ve GOP 2–4 saniye.
- Gecikme ne kadar?
- Belgelenmiş rakamlar şunlar: WebRTC (WHIP/WHEP) — “sub-second”, “less than 500 milliseconds”. RTMPS/SRT playback (native uygulama) — “glass-to-glass latency of less than 1 second”. LL-HLS (Beta) — 2023-09-25 blog'undan: “reducing the latency a viewer may experience on their player to as little as three seconds” (önceki hâli: “highs of around 30 seconds to less than 10”). Standart HLS/DASH için Cloudflare yayımlanmış bir rakam vermiyor — yalnızca GOP boyutunun gecikmeyi belirlediğini anlatıyor. Sabit bir sayı bekleme.
- Kaç platforma aynı anda yeniden yayın yapabilirim?
- Birebir: “Simulcasting lets you forward your live stream to third-party platforms such as Twitch, YouTube, Facebook, Twitter… You can simulcast to up to 50 concurrent destinations from each live input.” Faturaya etkisi var: simulcast “Simulcasting via SRT or RTMP live outputs” olarak teslim edilen dakika sayılıyor. Bir çıkışı silersen “that output will be disconnected within 30 seconds”.
- Canlı yayınım otomatik kaydediliyor mu?
- Yalnızca
recording.modeautomaticise — ve varsayılan değerioff. Açıksa: “All Stream Live videos are automatically recorded.” Kayıt “within 60 seconds after a live stream ends” hazır oluyor. İki sınır: “If a live video exceeds seven days in length, the recording will be truncated to seven days.” ve MP4 indirme yalnızca “live recordings under four hours” için. Otomatik silme istersendeleteRecordingAfterDays— minimum 30, maksimum 1.096 gün. - DRM desteği var mı?
- Stream dokümantasyonunda DRM belgelenmemiştir. Widevine, FairPlay ve PlayReady için 540 KB'lık doküman gövdesinde sıfır eşleşme var (pozitif kontrol:
signed url35 eşleşme). Bu “desteklenmiyor” demek değil, “belgelenmemiş” demek. Belgelenmiş erişim kontrolü yolları: imzalı URL/token,allowedOriginsveaccessRules(IP + ISO ülke kodu). Tokenexpdeğeri “Cannot be greater than 24 hours in the future”,accessRulesen fazla 5 kural alıyor. - Videoyu Cloudflare'de olmayan bir alan adına gömebilir miyim?
- Evet. Birebir: “Yes. Stream videos can be embedded on any domain, even domains not on Cloudflare.” CSP kullanıyorsan
videodelivery.netve*.cloudflarestream.comalan adlarını eklemen gerekiyor — oynatıcı içinframe-src, kendi player'ın içinmedia-src,img-srcveconnect-src. Daraltmak istersen*yerinecustomer-<CODE>yazabilirsin. - HDR video yükleyebilir miyim?
- Yükleyebilirsin ama SDR'a düşüyor. Birebir: “When HDR videos are uploaded to Stream, they are re-encoded and delivered in SDR format, to ensure compatibility with the widest range of viewing devices.”
- Altyazı formatı ne olmalı, Türkçe kodu nedir?
- Birebir: “Stream only supports WebVTT formatted caption files.” Dosya başına 10 MB, her dil benzersiz olmalı, ve video önce yüklenmiş olmalı. Dil kodu BCP 47; doküman Türkçe'yi açıkça örnekliyor:
| tr | Turkish |veSubtag: tr / Description: Turkish / Suppress-Script: Latn. AI ile altyazı üretme de var — 2025-01-30'da “Eleven new languages are now supported for transcription when using generated captions, available for free for video stored in Stream.” - Manifest'leri kendi CDN'imde önbelleğe alabilir miyim?
- Hayır. Birebir: “Manifests are dynamic assets that may be updated at any time. Do not cache, proxy, or store manifests; always read them directly from Stream. Outdated manifests may be missing features or refer to assets which have been moved.” Bu somut bir soruna dönüştü: 13 Nisan 2026'da segment formatı MPEG-TS'ten fragmented MP4'e geçti ve “Old segment references may result in
404errors after 2026-05-13.” - Neden R2'ye bir MP4 koymak yerine Stream kullanayım?
- Bazen kullanmamalısın — ve bunu Cloudflare kendisi söylüyor. Birebir: “For customers with a huge volume of short video, such as generative AI output, e-commerce product videos, social media clips, or short marketing content, uploading those assets to Stream is not always practical. Furthermore, Stream's key features like adaptive bitrate encoding and HLS packaging offer diminishing returns on short content or small files.” Onun yerine R2 + Media Transformations öneriliyor. Stream'i seçmen gereken yer: uzun form içerik, canlı yayın, adaptif bitrate ihtiyacı, DVR, altyazı ve imzalı erişim. Bir de maliyet notu: “Video stored in Stream does not incur additional storage fees from other storage products such as R2.”
- Yayın “Connected” görünüyor ama oynatıcı “Stream has not started yet” diyor.
- Resmî adımlar sırasıyla: 30 saniye bekle; yayını yeniden başlat; AAC ses gönderdiğini doğrula; keyframe aralığının 2–8 saniye arasında sabit olduğunu doğrula — “If the keyframe interval is set to variable or automatic, change it to a specific value such as four seconds.” Bu dördüncü madde en sık atlanan; OBS'te varsayılan çoğu zaman otomatiktir.
- Oynatıcı bazı tarayıcılarda çalışmıyor.
- Belgelenmiş asgari sürümler: masaüstünde Chrome ≥88, Firefox ≥87, Edge ≥89, Safari ≥14, Opera ≥75; mobilde Android'de Chrome 90, UC Browser ≥12.12, Samsung Internet ≥13, iOS'ta Safari ≥13.4. Ve dikkat çekici bir istisna, birebir: “Cloudflare Stream is not available on Chromium, as Chromium does not support H.264 videos.” Ayrıca Chromecast için: “Chromecast does not support audio and video delivered separately. To avoid potential issues with playback, we recommend using DASH, instead of HLS.”
- Türkiye'de veri yerelleştirme yapabilir miyim?
- Stream için hayır. Data Localization uyumluluk matrisinde Stream satırı Regional Services için ✘ “Not compatible”. Customer Metadata Boundary için 🚧 ve dipnotu: “Logs / Analytics not available outside US region when using Customer Metadata Boundary.” Ayrı bir satır olan Stream Delivery ✅ görünüyor ama o farklı bir özellik. Ayrıca Stream dokümantasyonunun tamamında
residency,localization,jurisdiction,TurkeyveGDPRkelimeleri sıfır eşleşme veriyor — bu konu yalnızca Data Localization dokümanlarında geçiyor.
İlgili servisler
- ImagesGörselleri saklar, resize eder, WebP/AVIF’e çevirir ve CDN’den sunar.
- RealtimeKitGörüntülü/sesli görüşme ve canlı yayın için hazır gerçek zamanlı iletişim altyapısı.
- R2S3 uyumlu object storage — çıkış (egress) trafiği ücretsiz.
- Realtime (TURN / SFU)WebRTC için NAT traversal (TURN) ve medya yönlendirme (SFU). Eski adı Cloudflare Calls.
- CDNStatik içeriği kullanıcıya en yakın şehirde cache’leyip origin yükünü düşürür.
- WorkersJavaScript/TypeScript/Python kodunu Cloudflare’in 330+ şehirdeki sunucularında, sunucu yönetmeden çalıştırır.
Bu sayfadaki fiyat ve özellik bilgileri 1 Eylül 2026 tarihinde Cloudflare’in resmî kaynaklarından doğrulanmıştır. Cloudflare fiyatlandırmasını önceden haber vermeden değiştirebilir; bağlayıcı bilgi içinresmî sayfaya bakın.