初尝ffmpeg

1,162 阅读2分钟

「这是我参与11月更文挑战的第3天,活动详情查看:2021最后一次更文挑战

ffmpeg 是强大的媒体文件转换工具,常用于转码,可选命令非常多,编码器、视频时长、帧率、分辨率、像素格式、采样格式、码率、裁剪选项、声道数等等。 更详细的请看雷神

想法

使用nodejs推流视频到本地服务器。

步骤

1.需要安装依赖node-media-serverfluent-ffmpeg ,node-media-server是一个node的流媒体服务,fluent-ffmpeg是可以在nodejs中使用ffmpeg命令的一个库。

2.引入模块并创建配置

const NodeMediaServer = require("node-media-server");
const ffmpeg = require('fluent-ffmpeg');
let command = ffmpeg();

const config = {
    rtmp: {
        port: 1935,
        chunk_size: 60000,
        gop_cache: true,
        ping: 60,
        ping_timeout: 30,
    },
    http: {
        port: 8900,
        allow_origin: "*",
    },
};

3.创建服务并启动

let nms = new NodeMediaServer(config);
nms.run();

4.创建ffmpeg配置

let options = [
    "-re",
    "-i",
    url,
    "-vcodec",
    "copy",
    "-codec",
    "copy",
    "-f",
    "flv",
]
let url = './2.mp4';//视频地址
//需要ffmpeg.exe包
command.outputOptions(options)
    .setFfmpegPath("./ffmpeg.exe")
    .save(url)
    .on("start", function (e) {
        console.log("stream is start: " + e);
    })
    .on("end", function (e) {
        console.log("ffmpeg is end");
    })
    .on("error", function (err) {
        console.log("ffmpeg is error! " + err);
    });

5.使用node或者nodemon运行这个js文件就可以在播放器观看了可以使用阿里在线播放器播放http://127.0.0.1:8900/live/stream.flv也可以下载vlc播放器直接播放rtmp流, 推荐个相关工具:obs。

ffmpeg还可以直接推当前摄像头和麦克风的流更多请参考网上的帖子,用fluent-ffmpeg可以实现一个视频截图小工具。

saveThumbnail() {
    ffmpeg(./2.mp4)
        .setFfmpegPath("./ffmpeg.exe")
        .noAudio()
        .setStartTime(1)
        .frames(1)
        .save("./img.png");
}

fluent-ffmpeg与ffmpeg的参数相差不大详细的请去官网查看。 用ffmpeg可以直接在命令行加参数查看和更改视频的编码、格式,它是一个非常强大的工具。可以实现如:

1.获取视频的信息

ffmpeg -i video.avi

2.将图片序列合成视频


ffmpeg -f image2 -i image%d.jpg video.mpg

上面的命令会把当前目录下的图片(名字如:image1.jpg. image2.jpg. 等...)合并成video.mpg

3.将视频分解成图片序列


ffmpeg -i video.mpg image%d.jpg

上面的命令会生成image1.jpg. image2.jpg. ...

支持的图片格式有:PGM. PPM. PAM. PGMYUV. JPEG. GIF. PNG. TIFF. SGI

能实现太多太多的处理视频、音频的功能,更详细的请参考雷神的帖子。

结语

这只是初尝ffmpeg目前只会用一点皮毛。