使用ffmpeg向crtmpserver發布rtsp流
ffmpeg的調用命令如下:
ffmpeg -re -i xxx.mp4 -vcodec copy -acodec copy -f rtsp rtsp://127.0.0.1/live/mystream
用ffmpeg做輸入測試
ffmpeg -re -i "E:\片源\復仇者聯盟720p.mov" -vcodec copy -acodec copy -f flv rtmp://192.168.11.75/live/test1 ffmpeg -re -i "E:\片源\復仇者聯盟720p.mov" -vcodec copy -acodec copy -f flv rtmpt://192.168.11.75:8080/live/test1
音視頻的編碼格式只能為H264、AAC。
發布以后可以通過rtmp的方式點播,流名稱是從s=No Name獲取的,即名稱就叫“No Name”,而不是ffmpeg命令中rtsp URL地址上的“mystream”。這樣就存在一個問題,不能通過ffmpeg向crtmpserver發布多路流了,因為流的名稱都為“No Name”。
從crtmpserver的日志可以看到sdp如下(需要將sources/thelib/include/protocols/rtp/rtspprotocol.h中的RTSP_DUMP_TRAFFIC定義打開):
ANNOUNCE rtsp://127.0.0.1:554/live/mystream RTSP/1.0
Content-Type: application/sdp
CSeq: 2
Content-Length: 498
v=0
o=- 0 0 IN IP4 127.0.0.1
s=No Name
c=IN IP4 127.0.0.1
t=0 0
a=tool:libavformat 54.63.104
m=video 0 RTP/AVP 96
b=AS:509
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=1; sprop-parameter-sets=Z0KAIJZSAKwMPN4CoQAAAwABAAADAAadoYMkgA==,aMuNSA==; profile-level-id=428020
a=control:streamid=0
m=audio 0 RTP/AVP 97
b=AS:102
a=rtpmap:97 MPEG4-GENERIC/44100/2
a=fmtp:97 profile-level-id=1;mode=AAC-hbr;sizelength=13;indexlength=3;indexdeltalength=3; config=1210
a=control:streamid=1
解決方法:
修改sources/thelib/src/protocols/rtp/basertspappprotocolhandler.cpp文件的HandleRTSPRequestAnnounce函數,原來的代碼為
string streamName = sdp.GetStreamName();
if (streamName == "") {
streamName = format("rtsp_stream_%u", pFrom->GetId());
}
pFrom->GetCustomParameters()["sdpStreamName"] = streamName;
即流名稱是從sdp的s字段獲取的。
需要改為從url獲取,為了方便解析,可規定url中"?"后面的為流名稱,形式為rtsp://127.0.0.1/live?mystream。如果url中沒有"?",會使用ID命名為“rtsp_stream_ID”的形式。
代碼相應改為:
RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成vector<string> lines;
string streamName;
split(requestHeaders[RTSP_FIRST_LINE][RTSP_URL], "?", lines);
if (lines.size() != 2) {
streamName = format("rtsp_stream_%u", pFrom->GetId());
}else {
streamName = lines[1];
}
pFrom->GetCustomParameters()["sdpStreamName"] = streamName;