正在显示
7 个修改的文件
包含
35 行增加
和
9 行删除
@@ -342,6 +342,7 @@ Remark: | @@ -342,6 +342,7 @@ Remark: | ||
342 | ## History | 342 | ## History |
343 | 343 | ||
344 | ### SRS 2.0 history | 344 | ### SRS 2.0 history |
345 | +* v2.0, 2015-05-29, fix [#409](https://github.com/simple-rtmp-server/srs/issues/409) support pure video hls. 2.0.172. | ||
345 | * v2.0, 2015-05-28, support [srs-dolphin][srs-dolphin], the multiple-process SRS. | 346 | * v2.0, 2015-05-28, support [srs-dolphin][srs-dolphin], the multiple-process SRS. |
346 | * v2.0, 2015-05-24, fix [#404](https://github.com/simple-rtmp-server/srs/issues/404) register handler then start http thread. 2.0.167. | 347 | * v2.0, 2015-05-24, fix [#404](https://github.com/simple-rtmp-server/srs/issues/404) register handler then start http thread. 2.0.167. |
347 | * v2.0, 2015-05-23, refine the thread, protocol, kbps code. 2.0.166 | 348 | * v2.0, 2015-05-23, refine the thread, protocol, kbps code. 2.0.166 |
@@ -608,7 +608,7 @@ vhost with-hls.srs.com { | @@ -608,7 +608,7 @@ vhost with-hls.srs.com { | ||
608 | # when codec changed, write the PAT/PMT table, but maybe ok util next ts. | 608 | # when codec changed, write the PAT/PMT table, but maybe ok util next ts. |
609 | # so user can set the default codec for mp3. | 609 | # so user can set the default codec for mp3. |
610 | # the available audio codec: | 610 | # the available audio codec: |
611 | - # aac, mp3 | 611 | + # aac, mp3, an |
612 | # default: aac | 612 | # default: aac |
613 | hls_acodec aac; | 613 | hls_acodec aac; |
614 | # the default video codec of hls. | 614 | # the default video codec of hls. |
@@ -420,6 +420,9 @@ int SrsHlsMuxer::segment_open(int64_t segment_start_dts) | @@ -420,6 +420,9 @@ int SrsHlsMuxer::segment_open(int64_t segment_start_dts) | ||
420 | } else if (default_acodec_str == "aac") { | 420 | } else if (default_acodec_str == "aac") { |
421 | default_acodec = SrsCodecAudioAAC; | 421 | default_acodec = SrsCodecAudioAAC; |
422 | srs_info("hls: use default aac acodec"); | 422 | srs_info("hls: use default aac acodec"); |
423 | + } else if (default_acodec_str == "an") { | ||
424 | + default_acodec = SrsCodecAudioDisabled; | ||
425 | + srs_info("hls: use default an acodec for pure video"); | ||
423 | } else { | 426 | } else { |
424 | srs_warn("hls: use aac for other codec=%s", default_acodec_str.c_str()); | 427 | srs_warn("hls: use aac for other codec=%s", default_acodec_str.c_str()); |
425 | } | 428 | } |
@@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | @@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||
31 | // current release version | 31 | // current release version |
32 | #define VERSION_MAJOR 2 | 32 | #define VERSION_MAJOR 2 |
33 | #define VERSION_MINOR 0 | 33 | #define VERSION_MINOR 0 |
34 | -#define VERSION_REVISION 171 | 34 | +#define VERSION_REVISION 172 |
35 | 35 | ||
36 | // server info. | 36 | // server info. |
37 | #define RTMP_SIG_SRS_KEY "SRS" | 37 | #define RTMP_SIG_SRS_KEY "SRS" |
@@ -136,6 +136,9 @@ enum SrsCodecAudio | @@ -136,6 +136,9 @@ enum SrsCodecAudio | ||
136 | // set to the max value to reserved, for array map. | 136 | // set to the max value to reserved, for array map. |
137 | SrsCodecAudioReserved1 = 16, | 137 | SrsCodecAudioReserved1 = 16, |
138 | 138 | ||
139 | + // for user to disable audio, for example, use pure video hls. | ||
140 | + SrsCodecAudioDisabled = 17, | ||
141 | + | ||
139 | SrsCodecAudioLinearPCMPlatformEndian = 0, | 142 | SrsCodecAudioLinearPCMPlatformEndian = 0, |
140 | SrsCodecAudioADPCM = 1, | 143 | SrsCodecAudioADPCM = 1, |
141 | SrsCodecAudioMP3 = 2, | 144 | SrsCodecAudioMP3 = 2, |
@@ -215,13 +215,13 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | @@ -215,13 +215,13 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||
215 | #define ERROR_HTTP_DVR_CREATE_REQUEST 3053 | 215 | #define ERROR_HTTP_DVR_CREATE_REQUEST 3053 |
216 | #define ERROR_HTTP_DVR_NO_TAEGET 3054 | 216 | #define ERROR_HTTP_DVR_NO_TAEGET 3054 |
217 | #define ERROR_ADTS_ID_NOT_AAC 3055 | 217 | #define ERROR_ADTS_ID_NOT_AAC 3055 |
218 | -// HDS error code | ||
219 | #define ERROR_HDS_OPEN_F4M_FAILED 3056 | 218 | #define ERROR_HDS_OPEN_F4M_FAILED 3056 |
220 | #define ERROR_HDS_WRITE_F4M_FAILED 3057 | 219 | #define ERROR_HDS_WRITE_F4M_FAILED 3057 |
221 | #define ERROR_HDS_OPEN_BOOTSTRAP_FAILED 3058 | 220 | #define ERROR_HDS_OPEN_BOOTSTRAP_FAILED 3058 |
222 | #define ERROR_HDS_WRITE_BOOTSTRAP_FAILED 3059 | 221 | #define ERROR_HDS_WRITE_BOOTSTRAP_FAILED 3059 |
223 | #define ERROR_HDS_OPEN_FRAGMENT_FAILED 3060 | 222 | #define ERROR_HDS_OPEN_FRAGMENT_FAILED 3060 |
224 | #define ERROR_HDS_WRITE_FRAGMENT_FAILED 3061 | 223 | #define ERROR_HDS_WRITE_FRAGMENT_FAILED 3061 |
224 | +#define ERROR_HLS_NO_STREAM 3062 | ||
225 | 225 | ||
226 | /////////////////////////////////////////////////////// | 226 | /////////////////////////////////////////////////////// |
227 | // HTTP/StreamCaster protocol error. | 227 | // HTTP/StreamCaster protocol error. |
@@ -302,10 +302,12 @@ int SrsTsContext::encode(SrsFileWriter* writer, SrsTsMessage* msg, SrsCodecVideo | @@ -302,10 +302,12 @@ int SrsTsContext::encode(SrsFileWriter* writer, SrsTsMessage* msg, SrsCodecVideo | ||
302 | vs = SrsTsStreamVideoH264; | 302 | vs = SrsTsStreamVideoH264; |
303 | video_pid = TS_VIDEO_AVC_PID; | 303 | video_pid = TS_VIDEO_AVC_PID; |
304 | break; | 304 | break; |
305 | + case SrsCodecVideoDisabled: | ||
306 | + vs = SrsTsStreamReserved; | ||
307 | + break; | ||
305 | case SrsCodecVideoReserved: | 308 | case SrsCodecVideoReserved: |
306 | case SrsCodecVideoReserved1: | 309 | case SrsCodecVideoReserved1: |
307 | case SrsCodecVideoReserved2: | 310 | case SrsCodecVideoReserved2: |
308 | - case SrsCodecVideoDisabled: | ||
309 | case SrsCodecVideoSorensonH263: | 311 | case SrsCodecVideoSorensonH263: |
310 | case SrsCodecVideoScreenVideo: | 312 | case SrsCodecVideoScreenVideo: |
311 | case SrsCodecVideoOn2VP6: | 313 | case SrsCodecVideoOn2VP6: |
@@ -323,6 +325,9 @@ int SrsTsContext::encode(SrsFileWriter* writer, SrsTsMessage* msg, SrsCodecVideo | @@ -323,6 +325,9 @@ int SrsTsContext::encode(SrsFileWriter* writer, SrsTsMessage* msg, SrsCodecVideo | ||
323 | as = SrsTsStreamAudioMp3; | 325 | as = SrsTsStreamAudioMp3; |
324 | audio_pid = TS_AUDIO_MP3_PID; | 326 | audio_pid = TS_AUDIO_MP3_PID; |
325 | break; | 327 | break; |
328 | + case SrsCodecAudioDisabled: | ||
329 | + as = SrsTsStreamReserved; | ||
330 | + break; | ||
326 | case SrsCodecAudioReserved1: | 331 | case SrsCodecAudioReserved1: |
327 | case SrsCodecAudioLinearPCMPlatformEndian: | 332 | case SrsCodecAudioLinearPCMPlatformEndian: |
328 | case SrsCodecAudioADPCM: | 333 | case SrsCodecAudioADPCM: |
@@ -340,6 +345,12 @@ int SrsTsContext::encode(SrsFileWriter* writer, SrsTsMessage* msg, SrsCodecVideo | @@ -340,6 +345,12 @@ int SrsTsContext::encode(SrsFileWriter* writer, SrsTsMessage* msg, SrsCodecVideo | ||
340 | break; | 345 | break; |
341 | } | 346 | } |
342 | 347 | ||
348 | + if (as == SrsTsStreamReserved && vs == SrsTsStreamReserved) { | ||
349 | + ret = ERROR_HLS_NO_STREAM; | ||
350 | + srs_error("hls: no video or audio stream, vcodec=%d, acodec=%d. ret=%d", vc, ac, ret); | ||
351 | + return ret; | ||
352 | + } | ||
353 | + | ||
343 | // when any codec changed, write PAT/PMT table. | 354 | // when any codec changed, write PAT/PMT table. |
344 | if (vcodec != vc || acodec != ac) { | 355 | if (vcodec != vc || acodec != ac) { |
345 | vcodec = vc; | 356 | vcodec = vc; |
@@ -360,6 +371,12 @@ int SrsTsContext::encode(SrsFileWriter* writer, SrsTsMessage* msg, SrsCodecVideo | @@ -360,6 +371,12 @@ int SrsTsContext::encode(SrsFileWriter* writer, SrsTsMessage* msg, SrsCodecVideo | ||
360 | int SrsTsContext::encode_pat_pmt(SrsFileWriter* writer, int16_t vpid, SrsTsStream vs, int16_t apid, SrsTsStream as) | 371 | int SrsTsContext::encode_pat_pmt(SrsFileWriter* writer, int16_t vpid, SrsTsStream vs, int16_t apid, SrsTsStream as) |
361 | { | 372 | { |
362 | int ret = ERROR_SUCCESS; | 373 | int ret = ERROR_SUCCESS; |
374 | + | ||
375 | + if (vs != SrsTsStreamVideoH264 && as != SrsTsStreamAudioAAC && as != SrsTsStreamAudioMp3) { | ||
376 | + ret = ERROR_HLS_NO_STREAM; | ||
377 | + srs_error("hls: no pmt pcr pid, vs=%d, as=%d. ret=%d", vs, as, ret); | ||
378 | + return ret; | ||
379 | + } | ||
363 | 380 | ||
364 | int16_t pmt_number = TS_PMT_NUMBER; | 381 | int16_t pmt_number = TS_PMT_NUMBER; |
365 | int16_t pmt_pid = TS_PMT_PID; | 382 | int16_t pmt_pid = TS_PMT_PID; |
@@ -754,15 +771,17 @@ SrsTsPacket* SrsTsPacket::create_pmt(SrsTsContext* context, int16_t pmt_number, | @@ -754,15 +771,17 @@ SrsTsPacket* SrsTsPacket::create_pmt(SrsTsContext* context, int16_t pmt_number, | ||
754 | pmt->last_section_number = 0; | 771 | pmt->last_section_number = 0; |
755 | pmt->program_info_length = 0; | 772 | pmt->program_info_length = 0; |
756 | 773 | ||
757 | - // use audio to carray pcr by default. | ||
758 | - // for hls, there must be atleast one audio channel. | ||
759 | - pmt->PCR_PID = apid; | ||
760 | - pmt->infos.push_back(new SrsTsPayloadPMTESInfo(as, apid)); | ||
761 | - | ||
762 | // if h.264 specified, use video to carry pcr. | 774 | // if h.264 specified, use video to carry pcr. |
763 | if (vs == SrsTsStreamVideoH264) { | 775 | if (vs == SrsTsStreamVideoH264) { |
764 | pmt->PCR_PID = vpid; | 776 | pmt->PCR_PID = vpid; |
765 | pmt->infos.push_back(new SrsTsPayloadPMTESInfo(vs, vpid)); | 777 | pmt->infos.push_back(new SrsTsPayloadPMTESInfo(vs, vpid)); |
778 | + } else if (as == SrsTsStreamAudioAAC || as == SrsTsStreamAudioMp3) { | ||
779 | + // use audio to carray pcr by default. | ||
780 | + // for hls, there must be atleast one audio channel. | ||
781 | + pmt->PCR_PID = apid; | ||
782 | + pmt->infos.push_back(new SrsTsPayloadPMTESInfo(as, apid)); | ||
783 | + } else { | ||
784 | + srs_assert(false); | ||
766 | } | 785 | } |
767 | 786 | ||
768 | pmt->CRC_32 = 0; // calc in encode. | 787 | pmt->CRC_32 = 0; // calc in encode. |
-
请 注册 或 登录 后发表评论