0

最近、私は iPhone ストリーミング (MMS プロトコルに基づく) のソフトウェア アーキテクチャを研究していました。

ご存知のように、MMS オーディオ ストリームを再生するには、libMMS を呼び出してリモート メディア サーバーから wma ストリーム データを読み取り、次に FFmpeg を呼び出してストリーム データを wma 形式から PCM データ バッファーにデコードし、最後に PCM データをエンキューする必要があります。 iPhone の audioqueue にバッファリングして、実際のサウンドを生成します。

上記の紹介は、iPhone ストリーミングの作業プロセスを説明しただけです。この単純な機能を実装するだけであれば、それは難しくありません。上記の紹介に従って、libMMS、FFMpeg、および audioqueue を段階的に呼び出すだけで、ストリーミング機能を実現できます。実際、私は先週コードを実装しました。

しかし、私が必要としているのは単純なストリーミング機能だけではありません! ローカルファイルシステムにアクセスするのと同じように、FFmpeg が libMMS にアクセスできるようにするソフトウェアアーキテクチャが必要です!

mms_read/mms_seek のような libMMS インターフェイスを av_read_frame/av_seek_frame のような FFmpeg ファイルシステム インターフェイスにフックする方法を知っている人はいますか?

4

1 に答える 1

1

今回も自分の質問に答えないといけないと思います……</p>

数週間の調査とデバッグの後、私はついに真実を知りました。

実際、libMMSをFFMpegに「フック」する必要はありません。なんで?FFMpegにはすでにネイティブのmmsプロトコルプロセスモジュール「mms_protocol」があるためです(FFMpegのmms_protocol.cを参照)。

私たちがする必要があるのは、次のようにmmsモジュールを有効にするようにFFMpegを構成することだけです(FFMpegのconfig.hを参照):

#define ENABLE_MMS_PROTOCOL 1
#define CONFIG_MMS_PROTOCOL 1

この設定の後、FFMpegはmmsプロトコルをプロトコルリストに追加します。(実際には、プロトコルリストにはすでに「ローカルファイルシステムプロトコル」が含まれています)。その結果、FFMpegは「mms:// hostserver/abc」メディアファイルをローカルメディアファイルのように扱うことができる可能性があります。したがって、次を使用してmmsメディアファイルを開いて読み取ることができます。

av_open_input_file();
av_read_frame();

以前にローカルメディアファイルで行ったように!

ちなみに、私のffmpegバージョンでは、mmsプロトコルを処理するためのlibAVFormatモジュールにまだ多くのバグがあります。私がデバッグするのに1週間かかりましたが、あなたと同じくらい頭のいい人にとってははるかに短いと思います:-)

于 2011-11-08T02:50:24.003 に答える