正在显示
6 个修改的文件
包含
110 行增加
和
10 行删除
| @@ -25,6 +25,8 @@ gcc srs_play.c ../../objs/lib/srs_librtmp.a -g -O0 -lstdc++ -o srs_play | @@ -25,6 +25,8 @@ gcc srs_play.c ../../objs/lib/srs_librtmp.a -g -O0 -lstdc++ -o srs_play | ||
| 25 | */ | 25 | */ |
| 26 | 26 | ||
| 27 | #include <stdio.h> | 27 | #include <stdio.h> |
| 28 | +#include <stdlib.h> | ||
| 29 | + | ||
| 28 | #include "../../objs/include/srs_librtmp.h" | 30 | #include "../../objs/include/srs_librtmp.h" |
| 29 | 31 | ||
| 30 | int main(int argc, char** argv) | 32 | int main(int argc, char** argv) |
| @@ -33,14 +35,14 @@ int main(int argc, char** argv) | @@ -33,14 +35,14 @@ int main(int argc, char** argv) | ||
| 33 | 35 | ||
| 34 | // packet data | 36 | // packet data |
| 35 | int type, size; | 37 | int type, size; |
| 36 | - u_int32_t timestamp; | 38 | + u_int32_t timestamp = 0; |
| 37 | char* data; | 39 | char* data; |
| 38 | 40 | ||
| 39 | printf("suck rtmp stream like rtmpdump\n"); | 41 | printf("suck rtmp stream like rtmpdump\n"); |
| 40 | printf("srs(simple-rtmp-server) client librtmp library.\n"); | 42 | printf("srs(simple-rtmp-server) client librtmp library.\n"); |
| 41 | printf("version: %d.%d.%d\n", srs_version_major(), srs_version_minor(), srs_version_revision()); | 43 | printf("version: %d.%d.%d\n", srs_version_major(), srs_version_minor(), srs_version_revision()); |
| 42 | 44 | ||
| 43 | - rtmp = srs_rtmp_create("rtmp://127.0.0.1:1935/live?vhost=__defaultVhost__/livestream"); | 45 | + rtmp = srs_rtmp_create("rtmp://127.0.0.1:1935/live/livestream"); |
| 44 | 46 | ||
| 45 | if (srs_simple_handshake(rtmp) != 0) { | 47 | if (srs_simple_handshake(rtmp) != 0) { |
| 46 | printf("simple handshake failed.\n"); | 48 | printf("simple handshake failed.\n"); |
| @@ -25,12 +25,20 @@ gcc srs_publish.c ../../objs/lib/srs_librtmp.a -g -O0 -lstdc++ -o srs_publish | @@ -25,12 +25,20 @@ gcc srs_publish.c ../../objs/lib/srs_librtmp.a -g -O0 -lstdc++ -o srs_publish | ||
| 25 | */ | 25 | */ |
| 26 | 26 | ||
| 27 | #include <stdio.h> | 27 | #include <stdio.h> |
| 28 | +#include <stdlib.h> | ||
| 29 | +#include <unistd.h> | ||
| 30 | + | ||
| 28 | #include "../../objs/include/srs_librtmp.h" | 31 | #include "../../objs/include/srs_librtmp.h" |
| 29 | 32 | ||
| 30 | int main(int argc, char** argv) | 33 | int main(int argc, char** argv) |
| 31 | { | 34 | { |
| 32 | srs_rtmp_t rtmp; | 35 | srs_rtmp_t rtmp; |
| 33 | 36 | ||
| 37 | + // packet data | ||
| 38 | + int type, size; | ||
| 39 | + u_int32_t timestamp = 0; | ||
| 40 | + char* data; | ||
| 41 | + | ||
| 34 | printf("publish rtmp stream to server like FMLE/FFMPEG/Encoder\n"); | 42 | printf("publish rtmp stream to server like FMLE/FFMPEG/Encoder\n"); |
| 35 | printf("srs(simple-rtmp-server) client librtmp library.\n"); | 43 | printf("srs(simple-rtmp-server) client librtmp library.\n"); |
| 36 | printf("version: %d.%d.%d\n", srs_version_major(), srs_version_minor(), srs_version_revision()); | 44 | printf("version: %d.%d.%d\n", srs_version_major(), srs_version_minor(), srs_version_revision()); |
| @@ -55,6 +63,20 @@ int main(int argc, char** argv) | @@ -55,6 +63,20 @@ int main(int argc, char** argv) | ||
| 55 | } | 63 | } |
| 56 | printf("publish stream success\n"); | 64 | printf("publish stream success\n"); |
| 57 | 65 | ||
| 66 | + for (;;) { | ||
| 67 | + type = SRS_RTMP_TYPE_VIDEO; | ||
| 68 | + timestamp += 40; | ||
| 69 | + size = 4096; | ||
| 70 | + data = (char*)malloc(4096); | ||
| 71 | + | ||
| 72 | + if (srs_write_packet(rtmp, type, timestamp, data, size) != 0) { | ||
| 73 | + goto rtmp_destroy; | ||
| 74 | + } | ||
| 75 | + printf("sent packet: type=%s, time=%d, size=%d\n", srs_type2string(type), timestamp, size); | ||
| 76 | + | ||
| 77 | + usleep(40 * 1000); | ||
| 78 | + } | ||
| 79 | + | ||
| 58 | rtmp_destroy: | 80 | rtmp_destroy: |
| 59 | srs_rtmp_destroy(rtmp); | 81 | srs_rtmp_destroy(rtmp); |
| 60 | 82 |
| @@ -677,7 +677,7 @@ int SrsSource::on_meta_data(SrsCommonMessage* msg, SrsOnMetaDataPacket* metadata | @@ -677,7 +677,7 @@ int SrsSource::on_meta_data(SrsCommonMessage* msg, SrsOnMetaDataPacket* metadata | ||
| 677 | cache_metadata = new SrsSharedPtrMessage(); | 677 | cache_metadata = new SrsSharedPtrMessage(); |
| 678 | 678 | ||
| 679 | // dump message to shared ptr message. | 679 | // dump message to shared ptr message. |
| 680 | - if ((ret = cache_metadata->initialize(msg, payload, size)) != ERROR_SUCCESS) { | 680 | + if ((ret = cache_metadata->initialize(&msg->header, payload, size)) != ERROR_SUCCESS) { |
| 681 | srs_error("initialize the cache metadata failed. ret=%d", ret); | 681 | srs_error("initialize the cache metadata failed. ret=%d", ret); |
| 682 | return ret; | 682 | return ret; |
| 683 | } | 683 | } |
| @@ -328,6 +328,51 @@ int srs_read_packet(srs_rtmp_t rtmp, int* type, u_int32_t* timestamp, char** dat | @@ -328,6 +328,51 @@ int srs_read_packet(srs_rtmp_t rtmp, int* type, u_int32_t* timestamp, char** dat | ||
| 328 | int srs_write_packet(srs_rtmp_t rtmp, int type, u_int32_t timestamp, char* data, int size) | 328 | int srs_write_packet(srs_rtmp_t rtmp, int type, u_int32_t timestamp, char* data, int size) |
| 329 | { | 329 | { |
| 330 | int ret = ERROR_SUCCESS; | 330 | int ret = ERROR_SUCCESS; |
| 331 | + | ||
| 332 | + srs_assert(rtmp != NULL); | ||
| 333 | + Context* context = (Context*)rtmp; | ||
| 334 | + | ||
| 335 | + SrsSharedPtrMessage* msg = NULL; | ||
| 336 | + | ||
| 337 | + if (type == SRS_RTMP_TYPE_AUDIO) { | ||
| 338 | + SrsMessageHeader header; | ||
| 339 | + header.initialize_audio(size, timestamp, context->stream_id); | ||
| 340 | + | ||
| 341 | + msg = new SrsSharedPtrMessage(); | ||
| 342 | + if ((ret = msg->initialize(&header, data, size)) != ERROR_SUCCESS) { | ||
| 343 | + srs_freepa(data); | ||
| 344 | + return ret; | ||
| 345 | + } | ||
| 346 | + } else if (type == SRS_RTMP_TYPE_VIDEO) { | ||
| 347 | + SrsMessageHeader header; | ||
| 348 | + header.initialize_video(size, timestamp, context->stream_id); | ||
| 349 | + | ||
| 350 | + msg = new SrsSharedPtrMessage(); | ||
| 351 | + if ((ret = msg->initialize(&header, data, size)) != ERROR_SUCCESS) { | ||
| 352 | + srs_freepa(data); | ||
| 353 | + return ret; | ||
| 354 | + } | ||
| 355 | + } else if (type == SRS_RTMP_TYPE_SCRIPT) { | ||
| 356 | + SrsMessageHeader header; | ||
| 357 | + header.initialize_amf0_script(size, context->stream_id); | ||
| 358 | + | ||
| 359 | + msg = new SrsSharedPtrMessage(); | ||
| 360 | + if ((ret = msg->initialize(&header, data, size)) != ERROR_SUCCESS) { | ||
| 361 | + srs_freepa(data); | ||
| 362 | + return ret; | ||
| 363 | + } | ||
| 364 | + } | ||
| 365 | + | ||
| 366 | + if (msg) { | ||
| 367 | + // send out encoded msg. | ||
| 368 | + if ((ret = context->rtmp->send_message(msg)) != ERROR_SUCCESS) { | ||
| 369 | + return ret; | ||
| 370 | + } | ||
| 371 | + } else { | ||
| 372 | + // directly free data if not sent out. | ||
| 373 | + srs_freepa(data); | ||
| 374 | + } | ||
| 375 | + | ||
| 331 | return ret; | 376 | return ret; |
| 332 | } | 377 | } |
| 333 | 378 |
| @@ -1193,6 +1193,33 @@ bool SrsMessageHeader::is_user_control_message() | @@ -1193,6 +1193,33 @@ bool SrsMessageHeader::is_user_control_message() | ||
| 1193 | return message_type == RTMP_MSG_UserControlMessage; | 1193 | return message_type == RTMP_MSG_UserControlMessage; |
| 1194 | } | 1194 | } |
| 1195 | 1195 | ||
| 1196 | +void SrsMessageHeader::initialize_amf0_script(int size, int stream) | ||
| 1197 | +{ | ||
| 1198 | + message_type = RTMP_MSG_AMF0DataMessage; | ||
| 1199 | + payload_length = (int32_t)size; | ||
| 1200 | + timestamp_delta = (int32_t)0; | ||
| 1201 | + timestamp = (int64_t)0; | ||
| 1202 | + stream_id = (int32_t)stream; | ||
| 1203 | +} | ||
| 1204 | + | ||
| 1205 | +void SrsMessageHeader::initialize_audio(int size, u_int32_t time, int stream) | ||
| 1206 | +{ | ||
| 1207 | + message_type = RTMP_MSG_AudioMessage; | ||
| 1208 | + payload_length = (int32_t)size; | ||
| 1209 | + timestamp_delta = (int32_t)time; | ||
| 1210 | + timestamp = (int64_t)time; | ||
| 1211 | + stream_id = (int32_t)stream; | ||
| 1212 | +} | ||
| 1213 | + | ||
| 1214 | +void SrsMessageHeader::initialize_video(int size, u_int32_t time, int stream) | ||
| 1215 | +{ | ||
| 1216 | + message_type = RTMP_MSG_VideoMessage; | ||
| 1217 | + payload_length = (int32_t)size; | ||
| 1218 | + timestamp_delta = (int32_t)time; | ||
| 1219 | + timestamp = (int64_t)time; | ||
| 1220 | + stream_id = (int32_t)stream; | ||
| 1221 | +} | ||
| 1222 | + | ||
| 1196 | SrsChunkStream::SrsChunkStream(int _cid) | 1223 | SrsChunkStream::SrsChunkStream(int _cid) |
| 1197 | { | 1224 | { |
| 1198 | fmt = 0; | 1225 | fmt = 0; |
| @@ -1516,7 +1543,7 @@ int SrsSharedPtrMessage::initialize(SrsCommonMessage* source) | @@ -1516,7 +1543,7 @@ int SrsSharedPtrMessage::initialize(SrsCommonMessage* source) | ||
| 1516 | { | 1543 | { |
| 1517 | int ret = ERROR_SUCCESS; | 1544 | int ret = ERROR_SUCCESS; |
| 1518 | 1545 | ||
| 1519 | - if ((ret = initialize(source, (char*)source->payload, source->size)) != ERROR_SUCCESS) { | 1546 | + if ((ret = initialize(&source->header, (char*)source->payload, source->size)) != ERROR_SUCCESS) { |
| 1520 | return ret; | 1547 | return ret; |
| 1521 | } | 1548 | } |
| 1522 | 1549 | ||
| @@ -1527,7 +1554,7 @@ int SrsSharedPtrMessage::initialize(SrsCommonMessage* source) | @@ -1527,7 +1554,7 @@ int SrsSharedPtrMessage::initialize(SrsCommonMessage* source) | ||
| 1527 | return ret; | 1554 | return ret; |
| 1528 | } | 1555 | } |
| 1529 | 1556 | ||
| 1530 | -int SrsSharedPtrMessage::initialize(SrsCommonMessage* source, char* payload, int size) | 1557 | +int SrsSharedPtrMessage::initialize(SrsMessageHeader* source, char* payload, int size) |
| 1531 | { | 1558 | { |
| 1532 | int ret = ERROR_SUCCESS; | 1559 | int ret = ERROR_SUCCESS; |
| 1533 | 1560 | ||
| @@ -1540,7 +1567,7 @@ int SrsSharedPtrMessage::initialize(SrsCommonMessage* source, char* payload, int | @@ -1540,7 +1567,7 @@ int SrsSharedPtrMessage::initialize(SrsCommonMessage* source, char* payload, int | ||
| 1540 | return ret; | 1567 | return ret; |
| 1541 | } | 1568 | } |
| 1542 | 1569 | ||
| 1543 | - header = source->header; | 1570 | + header = *source; |
| 1544 | header.payload_length = size; | 1571 | header.payload_length = size; |
| 1545 | 1572 | ||
| 1546 | ptr = new SrsSharedPtr(); | 1573 | ptr = new SrsSharedPtr(); |
| @@ -1549,9 +1576,9 @@ int SrsSharedPtrMessage::initialize(SrsCommonMessage* source, char* payload, int | @@ -1549,9 +1576,9 @@ int SrsSharedPtrMessage::initialize(SrsCommonMessage* source, char* payload, int | ||
| 1549 | ptr->payload = payload; | 1576 | ptr->payload = payload; |
| 1550 | ptr->size = size; | 1577 | ptr->size = size; |
| 1551 | 1578 | ||
| 1552 | - if (source->header.is_video()) { | 1579 | + if (source->is_video()) { |
| 1553 | ptr->perfer_cid = RTMP_CID_Video; | 1580 | ptr->perfer_cid = RTMP_CID_Video; |
| 1554 | - } else if (source->header.is_audio()) { | 1581 | + } else if (source->is_audio()) { |
| 1555 | ptr->perfer_cid = RTMP_CID_Audio; | 1582 | ptr->perfer_cid = RTMP_CID_Audio; |
| 1556 | } else { | 1583 | } else { |
| 1557 | ptr->perfer_cid = RTMP_CID_OverConnection2; | 1584 | ptr->perfer_cid = RTMP_CID_OverConnection2; |
| @@ -262,6 +262,10 @@ struct SrsMessageHeader | @@ -262,6 +262,10 @@ struct SrsMessageHeader | ||
| 262 | bool is_window_ackledgement_size(); | 262 | bool is_window_ackledgement_size(); |
| 263 | bool is_set_chunk_size(); | 263 | bool is_set_chunk_size(); |
| 264 | bool is_user_control_message(); | 264 | bool is_user_control_message(); |
| 265 | + | ||
| 266 | + void initialize_amf0_script(int size, int stream); | ||
| 267 | + void initialize_audio(int size, u_int32_t time, int stream); | ||
| 268 | + void initialize_video(int size, u_int32_t time, int stream); | ||
| 265 | }; | 269 | }; |
| 266 | 270 | ||
| 267 | /** | 271 | /** |
| @@ -434,9 +438,9 @@ public: | @@ -434,9 +438,9 @@ public: | ||
| 434 | virtual int initialize(SrsCommonMessage* source); | 438 | virtual int initialize(SrsCommonMessage* source); |
| 435 | /** | 439 | /** |
| 436 | * set the shared payload. | 440 | * set the shared payload. |
| 437 | - * we will use the payload, donot use the payload of source. | 441 | + * use source header, and specified param payload. |
| 438 | */ | 442 | */ |
| 439 | - virtual int initialize(SrsCommonMessage* source, char* payload, int size); | 443 | + virtual int initialize(SrsMessageHeader* source, char* payload, int size); |
| 440 | virtual SrsSharedPtrMessage* copy(); | 444 | virtual SrsSharedPtrMessage* copy(); |
| 441 | public: | 445 | public: |
| 442 | /** | 446 | /** |
-
请 注册 或 登录 后发表评论