Cloudflare Stream Beta Feedback



Anybody attempt to do this with the tus java client? Just using the example provided by the github readme and adding in the auth headers i’m getting the following returned. Using the same file with any of the other tus clients appears to work fine. Just the java giving issues. Logs below:

Starting upload…
Upload at 000.00%.
Upload at 017.27%.
Upload at 034.53%.
Upload at 051.80%.
Upload at 069.07%.
Upload at 086.34%.
Upload at 100.00%.
Response Code: 400
“result”: null,
“success”: false,
“errors”: [
“code”: 10005,
“message”: “Decoding Error”
“messages”: [
“code”: 10005,
“message”: “invalid character ‘\x00’ looking for beginning of value”

Exception in thread “main” unexpected status code (400) while uploading chunk
at VideoUploader$1.makeAttempt(
at VideoUploader.main(


Hey @mszoke87 - is it possible for you to post a snippet of your upload code for us to replicate this error?

public static void main (String args[]) throws IOException, ProtocolException {
        TusClient client = new TusClient();
        Map<String, String> headers = new HashMap<>();
        headers.put("X-Auth-Key", "{removed}");
        headers.put("X-Auth-Email", "{removed}");
        client.setUploadCreationURL(new URL("{zoneid}/media/"));
        client.enableResuming(new TusURLMemoryStore());
        File file = new File("/path/to/video");
        final TusUpload upload = new TusUpload(file);

        System.out.println("Starting upload...");

        TusExecutor executor = new TusExecutor() {
            protected void makeAttempt() throws ProtocolException, IOException {
                TusUploader uploader = client.createUpload(upload);

                do {
                    long totalBytes = upload.getSize();
                    long bytesUploaded = uploader.getOffset();
                    double progress = (double) bytesUploaded / totalBytes * 100;

                    System.out.printf("Upload at %06.2f%%.\n", progress);

                } while(uploader.uploadChunk() > -1);
                System.out.println("Upload finished.");
                System.out.format("Upload available at: %s", uploader.getUploadURL().toString());

Digging deeper…seems Java out of the box does not support the PATCH method (using HttpUrlConnection). The Java TUS client is modifying the request to send a POST request with the X-HTTP-Method-Override header indicating a PATCH request. Doing some reflection and modifying the TUS library I am able to enable the PATCH method and successfully upload a video (this is not ideal and potentially not supported in future releases of Java). Ideally cloudflare honors the HTTP-Method-Override header?


Great catch. We don’t support that header yet but I see it would be helpful if we did.


Is there way to programmatically control the player? Specifically using play(), pause(), seek() and a getCurrentTime(), getCurrentState() method? This is kind of a dealbreaker for me since our app Flowra is built upon these standard player functionalities in order to provide it’s core features.

And then there’s this “Video cannot be downloaded from Cloudflare stream” in the FAQs. Since all content is user generated, the user must be able to download his own recordings whenever he wants to. It’s the user’s content after all.

I highly really appreciate any clarification on these two blocking issues. Cheers!


Hi @alexosoft - not yet, but in the meantime you can use your own player. What you would need to do is get the HLS and DASH manifest files from us and add them to your own player. The file links are available at at the bottom of the page.

Downloads - we’re not setup to do downloads yet, our suggestion is to store an original copy of your videos with a storage provider such as S3.


This is awesome. But before start using, i think is important know the price… Or at least some possible prices…
Any info about this? :slight_smile:


What are the expected upload speeds? I have 200 up (specifically 206) and I am not going above 80-90 (with 2 parallel uploads), with the connection often dropping below 50.

Plus would be great to know pricing as well…


Uploaded via the web interface as the tus upload immediately failed with a 500 (no details on what is wrong, probably file over 2GB?).

Upload via web interface is choppy, utilizes about half of my modest upstream bandwidth.

Other, smaller file is 720p, but resulting stream is 360p only.

When AirPlaying on Safari Mac from CF’s player to Apple TV, no audio on TV. When AirPlaying from iPhone works ok.


Also, input is 25 fps, output is 30 fps for no good reason. Would like to see more parameters for the encode.


@timo Hey! Great questions. During encoding process take a look at your input file and encode to the higher bitrate and resolution if the original file has higher bitrate and resolution than the goal bitrate/resolution. Your 720p file might have had a lower bitrate than the 720p and 480p level so an extra encode might not have helped increase perceived quality.

Currently we force 30fps for 360p for mobile devices and we match your input frames per second exactly (60/120fps supported) on levels higher than 360p.

That being said, we’re constantly changing our encoding process from the feedback we receive. What kind of parameters would you be interested in changing? Low/Medium/High type settings or something more granular?


Hey @matteo - you always upload to the closest one of 135 Cloudflare datacenters. Upload speeds depend on what type of connection you have an time of day. What size of files were you uploading? Do you usually store your video files in a cloud storage provider or locally on your computer?


I was uploading to MXP I would guess, they were two ~1.5GB files. My connection is always at 206 Mbps in upload and 930 in download. The files were on my local SSD. I know for a fact that you are in an IX with peering to my ISP (Vodafone).

P.S. I can saturate the connection with Google Drive, which is in the same IX as you.


Both the direct link to the video + the embedded video are not working for me in IE11 (should be supported from IE11+ right?).


In cloudflare stream dashboard on IE11; when I load the page it shows that my video is ready with the embed / direct link etc. Then after few seconds it goes back to “Queued for processing” again. When I reload the page I see the embed/direct link again, and after a few seconds it goes to “Queued for processing” again.


I would like to see more detailed analytics, especially the point in the video where viewers start to drop off. Is that already possible currently with the API?


Can I use the preload=“none” attribute?
I have many video players in the same page so I don’t want to waste bandwidth.


Our video usually is very low motion, mostly just talking heads. So we get away with very low bitrates with the 720p video looking very acceptable. The 360p version CF encoded looks very much worse. I think only looking at bitrate to make that call will not result in a better viewing experience in all cases. (Plus if you do something like this, or like the 30 fps for mobile, please document it)

I’ve run into this with multiple providers that don’t expose more advanced options to the user. ffmpeg has a fantastic constant quality mode that can be coerced into doing an encode fit for streaming that’s mostly compliant to bitrate requirements. The tradeoff is that sudden motion will show block artifacts but we’re ok with that.

Same argument goes for audio: we only do talk, so 160k stereo audio is a waste of bandwidth and storage, 96k mono would be sufficient.

So for me, I’d like to see as many parameters in an expert mode to fine tune the encode within limits set by you. I see that this might not be feasible in the first release, but I’d like you to keep it in mind for later. I also talked about this with your PM on the phone in December.


@dani having direct access to the HLS/DASH URLs definitely helps! Thanks for the pointer.

Most of our user generated contents are private, i.e. it shouldn’t be possible to access content if you know the URL. Is there way to restrict access to streams e.g. via temporary access tokens?


MKV format video can’t processing.

MKV File: