首页 > 解决方案 > 如何使用 ffmpeg 将 h.264 流转换为 MP4 并将结果通过管道传输到客户端?

问题描述

我的服务器(node.js)上有一个 h.264 编码的视频流,我想用ffmpeg它来将它转换为 MP4 流。然后我想使用我设置的 HTTP 服务器的响应将 MP4 流从子进程传送到客户端。我对所有选项感到非常困惑,ffmpeg并且不确定如何将子进程的输出通过管道传输到 HTTP 响应。

我尝试了几种ffmpeg选项组合,但视频无法在浏览器中播放(或显示任何接收数据的迹象),我不知道我是否将其正确转换为 MP4。我也不确定我的管道是否正确。我在服务器或客户端都没有收到任何错误。

HTML:

<video id="videoPlayer" poster="assets/logo_25.png" autoplay muted controls>
    <source src="http://localhost:3001" type="video/mp4">
</video>

节点服务器:

const videoPORT = 3001;
var videoServer = http.createServer(function (req, res) {
    var videoIncommingPORT = 11111;
    var videoSocket = dgram.createSocket('udp4');

    videoSocket.on('listening', function () {
        var address = videoSocket.address();
    });

    videoSocket.on('message', function (message, remote) {
        var child_converter = spawn('ffmpeg', ['-fflags', '+genpts', '-r', '25', '-i', `${message}`, '-vcodec', 'libx264', '-f', 'mp4', 'copy', '-']);//convert h.264 to MP4 container

        child_converter.stdout.pipe(res);//pipe to response

        child_converter.stdout.on('data', (data) => {
            console.log(data);
        });
        child_converter.stderr.on('data', (data) => { 
            console.log(data); 
        });

    });
    videoSocket.bind(videoIncommingPORT);
});
videoServer.listen(videoPORT);

标签: node.jspipemp4h.264child-process

解决方案


推荐阅读