İçeriğe atla
Cloudflare Wiki

    ↑↓ gez↵ açEsc kapatCloudflare Wiki

    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.”

    DurumDoğru araç
    Kısa klip, ürün videosu, AI çıktısı, sosyal medya kesitiR2 + Media Transformations
    Uzun form içerik, adaptif bitrate ihtiyacıStream
    Canlı yayın, DVR, kayıtStream
    Altyazı, imzalı erişim, ülke bazlı kısıtStream

    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öntemNe zaman
    PanelKod yazmadan
    Bağlantıdan (/stream/copy)Video zaten R2, S3 veya GCS’te
    Doğrudan POST200 MB altı, güvenilir bağlantı
    tus200 MB üstü — zorunlu; ya da bağlantı güvenilmezse
    Direct Creator UploadSon 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:

    ParametreVarsayılanNot
    recording.modeoffautomatic yapmazsan kayıt olmuyor ve HLS/DASH ile izlenemiyor
    enabledtruefalse yapmak yayıncının bağlantısını reddediyor — yayını programatik bitirmenin yolu
    preferLowLatencyfalseLL-HLS beta; recording.mode da automatic olmalı
    deleteRecordingAfterDaysnullMinimum 30, maksimum 1.096 gün
    timeoutSeconds0Kopma ne kadar sürerse yeni bir video oluşacağını belirliyor

    Gecikme — belgelenmiş rakamlar

    YolGecikme
    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/DASHYayı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ı:

    YolNe 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 bindingenv.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, tr kodu 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)
    Terminal — jq çıktısında uid, rtmps.url (rtmps://live.cloudflare.com:443/live/) ve kısaltılmış stream key. Anahtarın tamamı ekranda olmasın

    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).

    Terminal — ffmpeg çıktısında Stream mapping satırları ve ilerleyen frame= / bitrate= sayacı

    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.

    İki bölmeli terminal — solda ffmpeg akmaya devam ediyor, sağda lifecycle çıktısında live: true ve videoUID, altında liveViewers sayacı

    Adım 4 — Tarayıcıda izle

    https://customer-<CODE>.cloudflarestream.com/<INPUT_UID>/watch
    Tarayıcı — Stream oynatıcısında test görüntüsü oynuyor, canlı göstergesi ve kalite seçimi görünür durumda

    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.

    İki bölmeli terminal — solda ffmpeg'in bağlantı kurup veri göndermesi, sağda lifecycle çıktısında live: false; ikisinin aynı anda olduğu net görünsün

    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
    Terminal — ffprobe çıktısında keyframe zaman damgaları; sabit GOP'ta düzenli aralıklar, değişken GOP'ta düzensiz aralıklar yan yana

    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"
    Terminal — kayıt listesinde status ready, süre ve oluşturma zamanı; panelde Stream Analytics'te üretilen dakikalar da eklenebilir

    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"
    Terminal — requireSignedURLs true yanıtı ve altında imzasız manifest isteğinin döndürdüğü HTTP kodu

    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.

    Terminal — anahtar id'si görünür, PEM içeriği bulanıklaştırılmış veya kadraj dışında

    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
    Terminal — python çıktısında üretilen JWT'nin ilk ve son bölümleri; payload'daki accessRules bloğu da ayrıca gösterilebilir

    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}'
    Terminal, tek kare — üstte http=403, altında country: TR ve colo: IST. Bu iki satırın aynı görüntüde olması demonun bütün değeri

    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.

    Terminal — aynı formatta http=200 ve country: TR / colo: IST satırları
    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"
    Terminal — iki HTTP kodu alt alta; yabancı origin reddedilmiş, doğru origin geçmiş

    Adım 7 — Faturaya etkisini gör

    Panel: Stream → Analytics. Bu demonun ürettiği Minutes Delivered rakamına bak.

    Panel ekran görüntüsü — Minutes Delivered grafiği ve bu demoya karşılık gelen artış

    Ölçüm tablosu

    ÖlçütDeğ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.”

    MetrikFiyatModel
    Minutes stored5 USD / 1.000 dakikaÖn ödemeli
    Minutes delivered1 USD / 1.000 dakikaKullanı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ünGeo Key ManagerRegional ServicesCustomer 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, or pendingupload state 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 Location başlığından ayrıştırma — “it is not recommended to parse this URL to get the ID. Instead, you should use the stream-media-id HTTP 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_EXHAUSTED webhook'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.mode automatic ise — ve varsayılan değeri off. 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 istersen deleteRecordingAfterDays — 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 url 35 eşleşme). Bu “desteklenmiyor” demek değil, “belgelenmemiş” demek. Belgelenmiş erişim kontrolü yolları: imzalı URL/token, allowedOrigins ve accessRules (IP + ISO ülke kodu). Token exp değeri “Cannot be greater than 24 hours in the future”, accessRules en 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.net ve *.cloudflarestream.com alan adlarını eklemen gerekiyor — oynatıcı için frame-src, kendi player'ın için media-src, img-src ve connect-src. Daraltmak istersen * yerine customer-<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 | ve Subtag: 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 404 errors 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, Turkey ve GDPR kelimeleri 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.

    Hata bildir

    Yanlış bir rakam, eskimiş bir bilgi veya bozuk bir bağlantı mı buldun? Bildir, kaynağıyla birlikte kontrol edelim.