noe*_*oel 5 ffmpeg h.264 node.js emscripten fluent-ffmpeg
我正在尝试将 ffmpeg 编译为 javascript,以便可以使用 node.js 解码 H.264 视频流。这些流是打包到 RTP NALU 中的 H.264 帧,因此任何解决方案都必须能够接受 H.264 帧而不是整个文件名。这些帧不能位于 MP4 或 AVI 等容器中,因为这样解复用器需要在进行解复用之前需要每个帧的时间戳,但我正在处理实时流,没有容器。
下面是我用来监听 udp 套接字的基本代码。在“消息”回调中,数据包是 RTP 数据报。数据报的数据部分是 H.264 帧(P 帧和 I 帧)。
var PORT = 33333;
var HOST = '127.0.0.1';
var dgram = require('dgram');
var server = dgram.createSocket('udp4');
server.on('listening', function () {
var address = server.address();
console.log('UDP Server listening on ' + address.address + ":" + address.port);
});
server.on('message', function (message, remote) {
console.log(remote.address + ':' + remote.port +' - ' + message);
frame = parse_rtp(message);
rgb_frame = some_library.decode_h264(frame); // This is what I need.
});
server.bind(PORT, HOST);
Run Code Online (Sandbox Code Playgroud)
我找到了Broadway.js库,但我无法让它工作,而且它不能处理我需要的 P 帧。我还找到了ffmpeg.js,但可以让它工作,并且它需要整个文件而不是流。同样,Fluent-ffmpeg似乎不支持文件流;所有示例都显示传递给构造函数的文件名。所以我决定编写自己的 API。
我已经能够将 ffmpeg 编译成一个大的 js 文件,但我不能那样使用它。我想围绕 ffmpeg 编写一个 API,然后将这些函数公开给 JS。所以在我看来我需要做以下事情:
我找到了WASM+ffmpeg,但是是中文的,有些步骤不清楚。特别是有这一步:
emcc web.c process.c ../lib/libavformat.bc ../lib/libavcodec.bc ../lib/libswscale.bc ../lib/libswresample.bc ../lib/libavutil.bc \
Run Code Online (Sandbox Code Playgroud)
我不明白所有 ffmpeg 组件如何编译成单独的 *.bc 文件。我按照那篇文章中的 emmake 命令进行操作,最终得到了一个大的 .bc 文件。
1. 有谁知道使用emscripten编译ffmpeg的步骤,以便我可以向javascript公开一些API?
2. 是否有更好的方法(有合适的文档/示例)使用节点解码h264视频流?
对于问题1:按照官方文档进行操作即可
考虑通常使用以下命令构建的情况:
Run Code Online (Sandbox Code Playgroud)./configure make要使用 Emscripten 进行构建,您可以使用以下命令:
Run Code Online (Sandbox Code Playgroud)# Run emconfigure with the normal configure command as an argument. ./emconfigure ./configure # Run emmake with the normal make to generate linked LLVM bitcode. ./emmake make # Compile the linked bitcode generated by make (project.bc) to JavaScript. # 'project.bc' should be replaced with the make output for your project (e.g. 'yourproject.so') # [-Ox] represents build optimisations (discussed in the next section). ./emcc [-Ox] project.bc -o project.js
对于问题2:c/c++库可以在node环境中调用。您可以编写一些 C/C++ 粘合代码或使用代理节点模块(如node-ffi )。
使用 node-ffi 调用现有库可能更容易。希望有帮助:)
| 归档时间: |
|
| 查看次数: |
3906 次 |
| 最近记录: |