正在显示
2 个修改的文件
包含
55 行增加
和
6 行删除
| @@ -65,6 +65,27 @@ int main(int argc, char** argv) | @@ -65,6 +65,27 @@ int main(int argc, char** argv) | ||
| 65 | goto rtmp_destroy; | 65 | goto rtmp_destroy; |
| 66 | } | 66 | } |
| 67 | 67 | ||
| 68 | + off_t file_size = lseek(raw_fd, 0, SEEK_END); | ||
| 69 | + if (file_size <= 0) { | ||
| 70 | + srs_trace("h264 raw file %s empty.", raw_file); | ||
| 71 | + goto rtmp_destroy; | ||
| 72 | + } | ||
| 73 | + srs_trace("read entirely h264 raw file, size=%dKB", (int)(file_size / 1024)); | ||
| 74 | + | ||
| 75 | + char* h264_raw = (char*)malloc(file_size); | ||
| 76 | + if (!h264_raw) { | ||
| 77 | + srs_trace("alloc raw buffer failed for file %s.", raw_file); | ||
| 78 | + goto rtmp_destroy; | ||
| 79 | + } | ||
| 80 | + | ||
| 81 | + lseek(raw_fd, 0, SEEK_SET); | ||
| 82 | + ssize_t nb_read = 0; | ||
| 83 | + if ((nb_read = read(raw_fd, h264_raw, file_size)) != file_size) { | ||
| 84 | + srs_trace("buffer %s failed, expect=%dKB, actual=%dKB.", | ||
| 85 | + raw_file, (int)(file_size / 1024), (int)(nb_read / 1024)); | ||
| 86 | + goto rtmp_destroy; | ||
| 87 | + } | ||
| 88 | + | ||
| 68 | // connect rtmp context | 89 | // connect rtmp context |
| 69 | srs_rtmp_t rtmp = srs_rtmp_create(rtmp_url); | 90 | srs_rtmp_t rtmp = srs_rtmp_create(rtmp_url); |
| 70 | 91 | ||
| @@ -86,10 +107,13 @@ int main(int argc, char** argv) | @@ -86,10 +107,13 @@ int main(int argc, char** argv) | ||
| 86 | } | 107 | } |
| 87 | srs_trace("publish stream success"); | 108 | srs_trace("publish stream success"); |
| 88 | 109 | ||
| 110 | + // @remark, the dts and pts if read from device, for instance, the encode lib, | ||
| 111 | + // so we assume the fps is 25, and each h264 frame is 1000ms/25fps=40ms/f. | ||
| 112 | + u_int32_t fps = 25; | ||
| 89 | u_int32_t dts = 0; | 113 | u_int32_t dts = 0; |
| 90 | u_int32_t pts = 0; | 114 | u_int32_t pts = 0; |
| 91 | for (;;) { | 115 | for (;;) { |
| 92 | - // read from file, or get h264 raw data from device, whatever. | 116 | + // get h264 raw data from device, whatever. |
| 93 | int size = 4096; | 117 | int size = 4096; |
| 94 | char* data = (char*)malloc(4096); | 118 | char* data = (char*)malloc(4096); |
| 95 | if ((size = read(raw_fd, data, size)) < 0) { | 119 | if ((size = read(raw_fd, data, size)) < 0) { |
| @@ -101,26 +125,37 @@ int main(int argc, char** argv) | @@ -101,26 +125,37 @@ int main(int argc, char** argv) | ||
| 101 | goto rtmp_destroy; | 125 | goto rtmp_destroy; |
| 102 | } | 126 | } |
| 103 | 127 | ||
| 128 | + // convert the h264 packet to rtmp packet. | ||
| 104 | char* rtmp_data = NULL; | 129 | char* rtmp_data = NULL; |
| 105 | int rtmp_size = 0; | 130 | int rtmp_size = 0; |
| 106 | u_int32_t timestamp = 0; | 131 | u_int32_t timestamp = 0; |
| 107 | - if (srs_h264_to_rtmp(data, size, dts, pts, &rtmp_data, &rtmp_size, ×tamp) < 0) { | 132 | + if (srs_h264_to_rtmp(data, size, dts, pts, &rtmp_data, &rtmp_size, ×tamp) != 0) { |
| 108 | srs_trace("h264 raw data to rtmp data failed."); | 133 | srs_trace("h264 raw data to rtmp data failed."); |
| 109 | goto rtmp_destroy; | 134 | goto rtmp_destroy; |
| 110 | } | 135 | } |
| 111 | 136 | ||
| 137 | + // send out the rtmp packet. | ||
| 112 | int type = SRS_RTMP_TYPE_VIDEO; | 138 | int type = SRS_RTMP_TYPE_VIDEO; |
| 113 | if (srs_write_packet(rtmp, type, timestamp, rtmp_data, rtmp_size) != 0) { | 139 | if (srs_write_packet(rtmp, type, timestamp, rtmp_data, rtmp_size) != 0) { |
| 114 | goto rtmp_destroy; | 140 | goto rtmp_destroy; |
| 115 | } | 141 | } |
| 116 | - srs_trace("sent packet: type=%s, time=%d, size=%d", srs_type2string(type), timestamp, rtmp_size); | 142 | + srs_trace("sent packet: type=%s, time=%d, size=%d, fps=%d", |
| 143 | + srs_type2string(type), timestamp, rtmp_size, fps); | ||
| 144 | + | ||
| 145 | + // @remark, please get the dts and pts from device, | ||
| 146 | + // we assume there is no B frame, and the fps can guess the fps and dts, | ||
| 147 | + // while the dts and pts must read from encode lib or device. | ||
| 148 | + dts += 1000 / fps; | ||
| 149 | + pts = dts; | ||
| 117 | 150 | ||
| 118 | - usleep(40 * 1000); | 151 | + // @remark, when use encode device, it not need to sleep. |
| 152 | + usleep(1000 / fps * 1000); | ||
| 119 | } | 153 | } |
| 120 | 154 | ||
| 121 | rtmp_destroy: | 155 | rtmp_destroy: |
| 122 | srs_rtmp_destroy(rtmp); | 156 | srs_rtmp_destroy(rtmp); |
| 123 | close(raw_fd); | 157 | close(raw_fd); |
| 158 | + free(h264_raw); | ||
| 124 | 159 | ||
| 125 | return 0; | 160 | return 0; |
| 126 | } | 161 | } |
| @@ -54,6 +54,7 @@ typedef void* srs_rtmp_t; | @@ -54,6 +54,7 @@ typedef void* srs_rtmp_t; | ||
| 54 | * create/destroy a rtmp protocol stack. | 54 | * create/destroy a rtmp protocol stack. |
| 55 | * @url rtmp url, for example: | 55 | * @url rtmp url, for example: |
| 56 | * rtmp://localhost/live/livestream | 56 | * rtmp://localhost/live/livestream |
| 57 | +* | ||
| 57 | * @return a rtmp handler, or NULL if error occured. | 58 | * @return a rtmp handler, or NULL if error occured. |
| 58 | */ | 59 | */ |
| 59 | extern srs_rtmp_t srs_rtmp_create(const char* url); | 60 | extern srs_rtmp_t srs_rtmp_create(const char* url); |
| @@ -63,6 +64,8 @@ extern srs_rtmp_t srs_rtmp_create(const char* url); | @@ -63,6 +64,8 @@ extern srs_rtmp_t srs_rtmp_create(const char* url); | ||
| 63 | * rtmp://localhost/live | 64 | * rtmp://localhost/live |
| 64 | * @remark this is used to create application connection-oriented, | 65 | * @remark this is used to create application connection-oriented, |
| 65 | * for example, the bandwidth client used this, no stream specified. | 66 | * for example, the bandwidth client used this, no stream specified. |
| 67 | +* | ||
| 68 | +* @return a rtmp handler, or NULL if error occured. | ||
| 66 | */ | 69 | */ |
| 67 | extern srs_rtmp_t srs_rtmp_create2(const char* url); | 70 | extern srs_rtmp_t srs_rtmp_create2(const char* url); |
| 68 | /** | 71 | /** |
| @@ -81,7 +84,8 @@ extern void srs_rtmp_destroy(srs_rtmp_t rtmp); | @@ -81,7 +84,8 @@ extern void srs_rtmp_destroy(srs_rtmp_t rtmp); | ||
| 81 | * category: publish/play | 84 | * category: publish/play |
| 82 | * previous: rtmp-create | 85 | * previous: rtmp-create |
| 83 | * next: connect-app | 86 | * next: connect-app |
| 84 | -* @return 0, success; otherwise, failed. | 87 | +* |
| 88 | +* @return 0, success; otherswise, failed. | ||
| 85 | */ | 89 | */ |
| 86 | /** | 90 | /** |
| 87 | * simple handshake specifies in rtmp 1.0, | 91 | * simple handshake specifies in rtmp 1.0, |
| @@ -107,7 +111,8 @@ extern int __srs_do_simple_handshake(srs_rtmp_t rtmp); | @@ -107,7 +111,8 @@ extern int __srs_do_simple_handshake(srs_rtmp_t rtmp); | ||
| 107 | * category: publish/play | 111 | * category: publish/play |
| 108 | * previous: handshake | 112 | * previous: handshake |
| 109 | * next: publish or play | 113 | * next: publish or play |
| 110 | -* @return 0, success; otherwise, failed. | 114 | +* |
| 115 | +* @return 0, success; otherswise, failed. | ||
| 111 | */ | 116 | */ |
| 112 | extern int srs_connect_app(srs_rtmp_t rtmp); | 117 | extern int srs_connect_app(srs_rtmp_t rtmp); |
| 113 | 118 | ||
| @@ -121,6 +126,8 @@ extern int srs_connect_app(srs_rtmp_t rtmp); | @@ -121,6 +126,8 @@ extern int srs_connect_app(srs_rtmp_t rtmp); | ||
| 121 | * @param srs_version, 32bytes, server version. | 126 | * @param srs_version, 32bytes, server version. |
| 122 | * @param srs_id, int, debug info, client id in server log. | 127 | * @param srs_id, int, debug info, client id in server log. |
| 123 | * @param srs_pid, int, debug info, server pid in log. | 128 | * @param srs_pid, int, debug info, server pid in log. |
| 129 | +* | ||
| 130 | +* @return 0, success; otherswise, failed. | ||
| 124 | */ | 131 | */ |
| 125 | extern int srs_connect_app2(srs_rtmp_t rtmp, | 132 | extern int srs_connect_app2(srs_rtmp_t rtmp, |
| 126 | char srs_server_ip[128], char srs_server[128], char srs_primary_authors[128], | 133 | char srs_server_ip[128], char srs_server[128], char srs_primary_authors[128], |
| @@ -157,6 +164,8 @@ extern int srs_publish_stream(srs_rtmp_t rtmp); | @@ -157,6 +164,8 @@ extern int srs_publish_stream(srs_rtmp_t rtmp); | ||
| 157 | * @param publish_bytes, output the publish/upload bytes. | 164 | * @param publish_bytes, output the publish/upload bytes. |
| 158 | * @param play_duration, output the play/download test duration, in ms. | 165 | * @param play_duration, output the play/download test duration, in ms. |
| 159 | * @param publish_duration, output the publish/upload test duration, in ms. | 166 | * @param publish_duration, output the publish/upload test duration, in ms. |
| 167 | +* | ||
| 168 | +* @return 0, success; otherswise, failed. | ||
| 160 | */ | 169 | */ |
| 161 | extern int srs_bandwidth_check(srs_rtmp_t rtmp, | 170 | extern int srs_bandwidth_check(srs_rtmp_t rtmp, |
| 162 | int64_t* start_time, int64_t* end_time, | 171 | int64_t* start_time, int64_t* end_time, |
| @@ -200,6 +209,8 @@ extern const char* srs_type2string(int type); | @@ -200,6 +209,8 @@ extern const char* srs_type2string(int type); | ||
| 200 | * | 209 | * |
| 201 | * @remark: for read, user must free the data. | 210 | * @remark: for read, user must free the data. |
| 202 | * @remark: for write, user should never free the data, even if error. | 211 | * @remark: for write, user should never free the data, even if error. |
| 212 | +* | ||
| 213 | +* @return 0, success; otherswise, failed. | ||
| 203 | */ | 214 | */ |
| 204 | extern int srs_read_packet(srs_rtmp_t rtmp, | 215 | extern int srs_read_packet(srs_rtmp_t rtmp, |
| 205 | int* type, u_int32_t* timestamp, char** data, int* size | 216 | int* type, u_int32_t* timestamp, char** data, int* size |
| @@ -334,6 +345,9 @@ convert h264 stream data to rtmp packet. | @@ -334,6 +345,9 @@ convert h264 stream data to rtmp packet. | ||
| 334 | @param prtmp_data the output rtmp format packet, which can be send by srs_write_packet. | 345 | @param prtmp_data the output rtmp format packet, which can be send by srs_write_packet. |
| 335 | @param prtmp_size the size of rtmp packet, for srs_write_packet. | 346 | @param prtmp_size the size of rtmp packet, for srs_write_packet. |
| 336 | @param ptimestamp the timestamp of rtmp packet, for srs_write_packet. | 347 | @param ptimestamp the timestamp of rtmp packet, for srs_write_packet. |
| 348 | +@remark, user should never free the h264_raw_data. | ||
| 349 | +@remark, user should free the prtmp_data if success. | ||
| 350 | +@return 0, success; otherswise, failed. | ||
| 337 | */ | 351 | */ |
| 338 | extern int srs_h264_to_rtmp( | 352 | extern int srs_h264_to_rtmp( |
| 339 | char* h264_raw_data, int h264_raw_size, u_int32_t dts, u_int32_t pts, | 353 | char* h264_raw_data, int h264_raw_size, u_int32_t dts, u_int32_t pts, |
-
请 注册 或 登录 后发表评论