3

ノードを使用してH.264ビデオストリームをデコードできるように、ffmpegをjavascriptにコンパイルしようとしています。ストリームは RTP NALU にパックされた H.264 フレームであるため、どのソリューションもファイル名全体ではなく H.264 フレームを受け入れることができる必要があります。これらのフレームは、MP4 や AVI などのコンテナに入れることはできません。これは、デマルチプレクサがデマルチプレクサを実行する前にすべてのフレームのタイムスタンプを必要とするためですが、コンテナではなくリアルタイム ストリームを扱っています。

RTP を介した H.264 のストリーミング

以下は、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);  

Broadway.jsライブラリを見つけましたが、動作させることができず、必要な P フレームを処理できません。ffmpeg.jsも見つかりましたが、それを機能させることができ、ストリームではなくファイル全体が必要です。同様に、fluent-ffmpegはファイル ストリームをサポートしていないようです。すべての例は、コンストラクターに渡されるファイル名を示しています。そこで、独自の API を作成することにしました。

私の現在の解決策の試み

ffmpeg を 1 つの大きな js ファイルにコンパイルすることはできましたが、そのように使用することはできません。ffmpeg に関する API を作成し、それらの関数を JS に公開したいと考えています。したがって、次のことを行う必要があるように思えます。

  1. ffmpeg コンポーネント (avcodec、avutil など) を llvm ビットコードにコンパイルします。
  2. デコード機能を公開し、EMSCRIPTEN_KEEPALIVE を使用する C ラッパーを作成します。
  3. emcc を使用してラッパーをコンパイルし、手順 1 で作成したビットコードにリンクします。

WASM+ffmpegを見つけましたが、中国語で、手順の一部が明確ではありません。特に、次のステップがあります。

emcc web.c process.c ../lib/libavformat.bc ../lib/libavcodec.bc ../lib/libswscale.bc ../lib/libswresample.bc ../lib/libavutil.bc \

:(私が立ち往生していると思う場所

すべての ffmpeg コンポーネントが個別の *.bc ファイルにコンパイルされる方法がわかりません。その記事の emmake コマンドを実行したところ、1 つの大きな .bc ファイルが作成されました。

2つの質問

1. 一部のAPIをjavascriptに公開できるように、emscriptenを使用してffmpegをコンパイルする手順を知っている人はいますか?
2. ノードを使用して h264 ビデオ ストリームをデコードするためのより良い方法 (適切なドキュメント/例を含む) はありますか?

4

2 に答える 2