• wasm 编译 ffmpeg 还有问题版本


    参考了这位大牛的文章  https://mp.weixin.qq.com/s/ccEjtjEyH3fRMNZQwF687w

    要记得编译脚本在的sdk根目录执行 sh文件EXPORTED_FUNCTIONS新版本不支持到处__exports_main 函数 但是可以直接使用

    直接贴html文件上来吧  后面读取日志转码的时候有溢出的情况 坑了我好久 

    const ffmpeg = Module.cwrap('emscripten_proxy_main', 'number', ['number', 'number']); 
     
     
    <html>
    <head>
    <style>
    html,
    body {
    margin: 0;

    100%;

    height: 100%;
    }

    body {
    display: flex;

    flex-direction: column;

    align-items: center;
    }
    </style>
    </head>

    <body>
    <h3>上传视频文件,然后转码到 mp4 (x264) 进行播放!</h3>

    <video id="output-video" controls></video><br />

    <input type="file" id="uploader" />

    <p id="message">ffmpeg 脚本需要等待 5S 左右加载完成</p>

    <script type="text/javascript">
    const readFromBlobOrFile = (blob) =>
    new Promise((resolve, reject) => {
    const fileReader = new FileReader();

    fileReader.onload = () => {
    resolve(fileReader.result);
    };

    fileReader.onerror = ({
    target: {
    error: { code },
    },
    }) => {
    reject(Error(`File could not be read! Code=${code}`));
    };

    fileReader.readAsArrayBuffer(blob);
    });

    const message = document.getElementById("message");

    const transcode = async ({ target: { files } }) => {
    const { name } = files[0];

    message.innerHTML = "将文件写入到 Emscripten 文件系统";

    const data = await readFromBlobOrFile(files[0]);

    // Module.HEAP8.set()

    Module.FS.writeFile(name, new Uint8Array(data));

    const ffmpeg = Module.cwrap("emscripten_proxy_main", "number", [
    "number",
    "number",
    ]);
    const args = [
    "ffmpeg",
    "-hide_banner",
    "-nostdin",
    "-report",
    "-i",
    name,
    "out.mp4",
    ];

    const argsPtr = Module._malloc(
    args.length * Uint32Array.BYTES_PER_ELEMENT
    );

    args.forEach((s, idx) => {
    const buf = Module._malloc(s.length + 1);

    Module.writeAsciiToMemory(s, buf);

    Module.setValue(
    argsPtr + Uint32Array.BYTES_PER_ELEMENT * idx,
    buf,
    "i32"
    );
    });

    message.innerHTML = "开始转码";

    ffmpeg(args.length, argsPtr);

    let aTimes = 0;
    const timer = setInterval(() => {
    aTimes++;
    console.log(" aTimes is ", aTimes);

    const logFileName = Module.FS.readdir(".").find((name) =>
    name.endsWith(".log")
    );

    if (typeof logFileName !== "undefined") {
    let array = Module.FS.readFile(logFileName);
    // const log = String.fromCharCode.apply(null, Module.FS.readFile(logFileName));
    var log = "";
    var chunk = 8 * 1024;
    var i;
    for (i = 0; i < array.length / chunk; i++) {
    log += String.fromCharCode.apply(
    null,
    array.slice(i * chunk, (i + 1) * chunk)
    );
    }
    log += String.fromCharCode.apply(null, array.slice(i * chunk));
    console.log(" log is ", log);
    if (log.includes("frames successfully decoded")) {
    clearInterval(timer);

    message.innerHTML = "完成转码";

    const out = Module.FS.readFile("out.mp4");

    const video = document.getElementById("output-video");

    video.src = URL.createObjectURL(
    new Blob([out.buffer], { type: "video/mp4" })
    );
    }
    }
    }, 1000);
    };

    document.getElementById("uploader").addEventListener("change", transcode);
    </script>

    <script type="text/javascript" src="./dist/ffmpeg-core.js"></script>
    </body>
    </html>
  • 相关阅读:
    20165212任胤第五周学习总结
    20165212任胤第四周学习总结
    20165212任胤第四周课上作业补做
    20165212任胤第三周学习总结
    20165212任胤 第二周学习总结
    20165212 第一周学习总结
    西瓜书课后习题——第二章
    python官方中文文档
    西瓜书课后习题——第一章
    vim常用方法
  • 原文地址:https://www.cnblogs.com/rexzhao/p/15589076.html
Copyright © 2020-2023  润新知