IPC開発中にRTMP(S)の理解と解決する方法、手段を共有させていただきます。
■RTMP(S)は何?
RTMPはReal-Time Messaging Protocolの省略です。RTMPとは、米アドビ(Adobe)社の「Flash」で利用できるプロトコル(通信規約)の一つで、動画や音声のストリーミング配信・再生を行うためのもの。サーバとクライアントの間で連続的にメディアデータの伝送を行うことができる。
このような伝送方式は「ストリーミング」(streaming)と呼ばれ、再生開始時に終わりが決まっていない生中継型の放送・配信や、通話型のリアルタイムな双方向コミュニケーションなどのシステムで特に有用となる。
RTMPSはSSL/TLSで暗号化されたHTTPSを介してTCPの443番ポートで通信する拡張仕様です。
■RTMP(S)の特性は何?
下記が特性の概要です。
・オーディオコーデック: AAC、AAC-LC、HE-AAC+ v1 & v2、MP3、Speex
・ビデオコーデック: H.264、VP8、VP6、Sorenson Spark®、スクリーンビデオ v1 & v2
・メリット: 低遅延で最小限のバッファリング
・デメリット: 視聴体験の品質やスケーラビリティが最適化されていない
・遅延: 3 秒
■RTMP(S)の構成は何?
今のIPC製品はEncoderが全部カメラのSocに内臓されています。カメラ側がRTMPストリームをMediaServerに流すことになっています。携帯側かPC側でrtmpを見るために、カメラのrtmpのストリームとrtmpサーバーが要ります。これからカメラのrtmpとrtmpサーバーを簡単に紹介します。
■IPC側のRTMPを流す方法は何?
二つの方法があると思います。OpenSourceのLibで実現するとFFMPEGを使う方法です。では二つの方法を簡単にご紹介します。
・OpenSourceのLibを使って実現する
現状有名なLibはlibrtmpです。下記のアドレスからコードを取得できます。
https://github.com/ossrs/librtmp
それをCrosscompileしないといけません。下記はコマンドの例です。
make CROSS_COMPILE=arm-none-linux- INC=-I/my/cross/includes
※OpensslとZlibが必要です。自分でビルドしないといけない可能性があります。
Librtmpを使う概要:IPCからencodeしたH264のstreamを取得して、H264のデータを解析して、naluをAVCのフォマートに変換して、通知する。下記は使用例のサンプルです。
https://gitee.com/gitee.thomas/librtmp_send264_linux
もう一つLibはsrs_librtmpです。このlibの特徴はカメラからEncodeしたH264をそのまま使ってAVCフォマートに変換せずrtmpを実現できます。制限としてはrtmpsがサポートされていません。下記からコードを取得できます。※実際はこのLibはSRSサーバの付属品です。
ビルド方法:https://github.com/ossrs/srs/wiki/v3_EN_SrsLibrtmpにあります、サンプルコードも一緒にビルドされます。
・FFMPEGを使う
Videoのファイルをrtmpサーバーに流す方法は下記です。
ffmpeg -i ${input_video} -f flv rtmp://${server}/${liveName}/${streamName}
最後、ありがとうございました。
今度はRTMP雑談(下)でRTMPサーバー構築について共有させていただきます。