diff --git a/libavformat/avio.c b/libavformat/avio.c
index a9f42530594cbf3531ff2c3b40a44606fb5aa039..efe1c26683f97719c37d88875026fc1f7a7520b9 100644
--- a/libavformat/avio.c
+++ b/libavformat/avio.c
@@ -288,17 +288,17 @@ int ffurl_alloc(URLContext **puc, const char *filename, int flags,
 {
     URLProtocol *up = NULL;
     char proto_str[128], proto_nested[128], *ptr;
-    const char *proto_end = strchr(filename, ':');
+    size_t proto_len = strspn(filename, URL_SCHEME_CHARS);
 
     if (!first_protocol) {
         av_log(NULL, AV_LOG_WARNING, "No URL Protocols are registered. "
                                      "Missing call to av_register_all()?\n");
     }
 
-    if (!proto_end || is_dos_path(filename))
+    if (filename[proto_len] != ':' &&  filename[proto_len] != ',' || is_dos_path(filename))
         strcpy(proto_str, "file");
     else
-        av_strlcpy(proto_str, filename, FFMIN(proto_end-filename+1, sizeof(proto_str)));
+        av_strlcpy(proto_str, filename, FFMIN(proto_len+1, sizeof(proto_str)));
 
     if ((ptr = strchr(proto_str, ',')))
         *ptr = '\0';