向IMG,VIDEO和AUDIO请求添加自定义标头

时间:2015-07-13 21:51:25

标签: javascript video http-headers

我正在开发一个项目,我们需要在浏览器中为图像,视频和音频内容的HTTP请求添加一些自定义标头。除了可能创建浏览器插件之外,我一直在环顾四周并没有找到一个好的答案。

此时不能选择装饰URL,因为网关正在寻找标题。

我可以通过AJAX请求获取内容并将标头添加到AJAX请求中,然后重新组合内容,base64对其进行编码,然后将其提供给图像,视频或音频元素,使用data: URI src。但这非常低效,特别是对于视频,我们认为内容可能高达120MB。此技术也不允许视频元素缓冲流。

所以我正在寻找关于如何使用本机浏览器行为的想法,但是注入了所需的自定义标头。我能不能

<img src="javascript:MyFunction(this)" />

<video src="javascript:MyFunction(this)" />

2 个答案:

答案 0 :(得分:0)

您想使用浏览器的本机功能来下载和呈现图像,音频和视频请求。简单的解决方案:使用<iframe/>,然后在要下载内容时,将src设置为图像,音频或视频的URL。例如...

<iframe src="https://wikipedia.com"/>

在此代码段中,我使用了一个简单的URL,而不是实际的图像,视频或音频文件,因为不建议在线进行热链接。

通过使用iframe,浏览器的所有自然下载和渲染元素都将可用,此外,您可以将iframe放在应用程序中的任何位置,从而完全控制浏览器的可靠性。

答案 1 :(得分:-1)

据我所知,唯一的方法是使用XMLHttpRequest或fetch,但是您可以尝试获取视频的二进制数据并使用本机流API对其进行流处理。

如果服务器允许部分请求,则仅允许您获取一定数量的字节

您可以将不同的字节附加到媒体源https://developer.mozilla.org/en-US/docs/Web/API/MediaSource

我几乎可以正常工作

<div id="u"></div>
<Script>
vd("ok.mp4")
function vd(src) {
    
    var v=document. createElement("video")
    document.body.appendChild(v)
//  v.autoplay=true
    v. controls=true
//  v.src=src 
    v.play()
    
    var mime=
        'video/mp4; '+
        'codecs="avc1.42E01E, mp4a.40.2"'
    var ms= new MediaSource()
    v.src=URL.createObjectURL(ms)
    
    ms.addEventListener(
        "sourceopen", 
        function (){
            if(
                !MediaSource.
                isTypeSupported(
                    mime
                )
            ){
                u.innerHTML="eh"
                return
            }
            var sb= ms.addSourceBuffer(mime)
            fatch(src, function (d,hd){
                u.innerText=770+hd
                u.innerText+="7+("+d.length
                sb.appendBuffer(d)
                
                
                sb.addEventListener(
                    "updateend",
                    function (){
                        u.innerText+="&&77++"
                        ms.endOfStream()
                        v.play()
                    }
                )
                sb.addEventListener(
                    "error",
                    function (e){
                        u.innerText+=Object.entries(e)
                    }
                )
                sb.addEventListener(
                    "abort",
                    function (e){
                        u.innerText+=Object.entries(e)
                    }
                )
                sb.addEventListener(
                    "update",
                    function (e){
                        u.innerText+=Object.entries(e)
                    }
                )
                sb.addEventListener(
                    "updatestart",
                    function (e){
                        u.innerText+="ok man"
                    //  +objecktify(e)
                    }
                )
                
                
                
            })
        }
    )
    
}

function objecktify(obj) {
    var d=[]
    for(var k in obj){
        d.push([k,JSON.stringify(obj[k])])
    }
    return JSON.stringify(d,4,4,4)
}
function fatch(url, obj1) {
    var obj=obj1
    if(!typeof(obj)=="object")obj={}
    if(typeof(url) == "string") obj.url= url
    if (typeof(url)=="object") obj=url
    if(typeof(obj1)=="function") obj.cb=obj1
    
    var x= new XMLHttpRequest ()
    x.onload= function (){
        if(typeof (obj.cb)=="function"){
            obj.cb(
                x.response,
                x.getAllResponseHeaders()
            )
        }
    }
    if(typeof(
        obj.headers
    )=="object") {
        Object.entries(
            obj.headers
        ).forEach(function (z){
            x.setHeader(
                z[0],
                z[1]
            )
        
        })
    }
    
    x.responseType="arraybuffer"
    x.open("get",obj.url)
    x.send()
}
</Script>

尽管问题是媒体源只能处理碎片化的mp4 https://github.com/w3c/media-source/issues/216 https://stackoverflow.com/a/18745164/2016831

但是,通过更多的研究,应该有可能在使用ffmpeg.js的情况下使用JavaScript手动/自动分割mp4视频的各个部分