fix hls media codec info bug, ignore nal_unit_type 7/8/9. 0.9.152
正在显示
2 个修改的文件
包含
43 行增加
和
7 行删除
@@ -1214,10 +1214,19 @@ int SrsHlsCache::cache_video(SrsAvcAacCodec* codec, SrsCodecSample* sample) | @@ -1214,10 +1214,19 @@ int SrsHlsCache::cache_video(SrsAvcAacCodec* codec, SrsCodecSample* sample) | ||
1214 | { | 1214 | { |
1215 | int ret = ERROR_SUCCESS; | 1215 | int ret = ERROR_SUCCESS; |
1216 | 1216 | ||
1217 | + // for type1/5/6, insert aud packet. | ||
1217 | static u_int8_t aud_nal[] = { 0x00, 0x00, 0x00, 0x01, 0x09, 0xf0 }; | 1218 | static u_int8_t aud_nal[] = { 0x00, 0x00, 0x00, 0x01, 0x09, 0xf0 }; |
1218 | - vb->append(aud_nal, sizeof(aud_nal)); | ||
1219 | 1219 | ||
1220 | bool sps_pps_sent = false; | 1220 | bool sps_pps_sent = false; |
1221 | + bool aud_sent = false; | ||
1222 | + /** | ||
1223 | + * a ts sample is format as: | ||
1224 | + * 00 00 00 01 // header | ||
1225 | + * xxxxxxx // data bytes | ||
1226 | + * 00 00 01 // continue header | ||
1227 | + * xxxxxxx // data bytes. | ||
1228 | + * so, for each sample, we append header in aud_nal, then appends the bytes in sample. | ||
1229 | + */ | ||
1221 | for (int i = 0; i < sample->nb_buffers; i++) { | 1230 | for (int i = 0; i < sample->nb_buffers; i++) { |
1222 | SrsCodecBuffer* buf = &sample->buffers[i]; | 1231 | SrsCodecBuffer* buf = &sample->buffers[i]; |
1223 | int32_t size = buf->size; | 1232 | int32_t size = buf->size; |
@@ -1228,12 +1237,20 @@ int SrsHlsCache::cache_video(SrsAvcAacCodec* codec, SrsCodecSample* sample) | @@ -1228,12 +1237,20 @@ int SrsHlsCache::cache_video(SrsAvcAacCodec* codec, SrsCodecSample* sample) | ||
1228 | return ret; | 1237 | return ret; |
1229 | } | 1238 | } |
1230 | 1239 | ||
1240 | + /** | ||
1241 | + * step 1: | ||
1242 | + * first, before each "real" sample, | ||
1243 | + * we add some packets according to the nal_unit_type, | ||
1244 | + * for example, when got nal_unit_type=5, insert SPS/PPS before sample. | ||
1245 | + */ | ||
1246 | + | ||
1231 | // 5bits, 7.3.1 NAL unit syntax, | 1247 | // 5bits, 7.3.1 NAL unit syntax, |
1232 | // H.264-AVC-ISO_IEC_14496-10.pdf, page 44. | 1248 | // H.264-AVC-ISO_IEC_14496-10.pdf, page 44. |
1233 | u_int8_t nal_unit_type; | 1249 | u_int8_t nal_unit_type; |
1234 | nal_unit_type = *buf->bytes; | 1250 | nal_unit_type = *buf->bytes; |
1235 | nal_unit_type &= 0x1f; | 1251 | nal_unit_type &= 0x1f; |
1236 | 1252 | ||
1253 | + // @see: ngx_rtmp_hls_video | ||
1237 | // Table 7-1 – NAL unit type codes, page 61 | 1254 | // Table 7-1 – NAL unit type codes, page 61 |
1238 | // 1: Coded slice | 1255 | // 1: Coded slice |
1239 | if (nal_unit_type == 1) { | 1256 | if (nal_unit_type == 1) { |
@@ -1245,27 +1262,43 @@ int SrsHlsCache::cache_video(SrsAvcAacCodec* codec, SrsCodecSample* sample) | @@ -1245,27 +1262,43 @@ int SrsHlsCache::cache_video(SrsAvcAacCodec* codec, SrsCodecSample* sample) | ||
1245 | //if (vf->key && !sps_pps_sent) { | 1262 | //if (vf->key && !sps_pps_sent) { |
1246 | sps_pps_sent = true; | 1263 | sps_pps_sent = true; |
1247 | 1264 | ||
1248 | - // ngx_rtmp_hls_append_sps_pps | 1265 | + // @see: ngx_rtmp_hls_append_sps_pps |
1249 | if (codec->sequenceParameterSetLength > 0) { | 1266 | if (codec->sequenceParameterSetLength > 0) { |
1250 | - // AnnexB prefix | 1267 | + // AnnexB prefix, for sps always 4 bytes header |
1251 | vb->append(aud_nal, 4); | 1268 | vb->append(aud_nal, 4); |
1252 | // sps | 1269 | // sps |
1253 | vb->append(codec->sequenceParameterSetNALUnit, codec->sequenceParameterSetLength); | 1270 | vb->append(codec->sequenceParameterSetNALUnit, codec->sequenceParameterSetLength); |
1254 | } | 1271 | } |
1255 | if (codec->pictureParameterSetLength > 0) { | 1272 | if (codec->pictureParameterSetLength > 0) { |
1256 | - // AnnexB prefix | 1273 | + // AnnexB prefix, for pps always 4 bytes header |
1257 | vb->append(aud_nal, 4); | 1274 | vb->append(aud_nal, 4); |
1258 | // pps | 1275 | // pps |
1259 | vb->append(codec->pictureParameterSetNALUnit, codec->pictureParameterSetLength); | 1276 | vb->append(codec->pictureParameterSetNALUnit, codec->pictureParameterSetLength); |
1260 | } | 1277 | } |
1261 | } | 1278 | } |
1279 | + // 6: Supplemental enhancement information (SEI) sei_rbsp( ), page 61 | ||
1280 | + // @see: ngx_rtmp_hls_append_aud | ||
1281 | + if (nal_unit_type == 6 && !aud_sent) { | ||
1282 | + // for type 6, append a aud with type 9. | ||
1283 | + vb->append(aud_nal, sizeof(aud_nal)); | ||
1284 | + } | ||
1285 | + // 7-9, ignore, @see: ngx_rtmp_hls_video | ||
1286 | + if (nal_unit_type >= 7 && nal_unit_type <= 9) { | ||
1287 | + continue; | ||
1288 | + } | ||
1289 | + | ||
1290 | + /** | ||
1291 | + * step 2: | ||
1292 | + * output the "real" sample, in buf. | ||
1293 | + * when we output some special assist packets according to nal_unit_type | ||
1294 | + */ | ||
1262 | 1295 | ||
1263 | // sample start prefix, '00 00 00 01' or '00 00 01' | 1296 | // sample start prefix, '00 00 00 01' or '00 00 01' |
1264 | u_int8_t* p = aud_nal + 1; | 1297 | u_int8_t* p = aud_nal + 1; |
1265 | u_int8_t* end = p + 3; | 1298 | u_int8_t* end = p + 3; |
1266 | 1299 | ||
1267 | // first AnnexB prefix is long (4 bytes) | 1300 | // first AnnexB prefix is long (4 bytes) |
1268 | - if (i == 0) { | 1301 | + if (vb->size == 0) { |
1269 | p = aud_nal; | 1302 | p = aud_nal; |
1270 | } | 1303 | } |
1271 | vb->append(p, end - p); | 1304 | vb->append(p, end - p); |
@@ -1496,8 +1529,11 @@ void SrsHls::hls_mux() | @@ -1496,8 +1529,11 @@ void SrsHls::hls_mux() | ||
1496 | { | 1529 | { |
1497 | // reportable | 1530 | // reportable |
1498 | if (pithy_print->can_print()) { | 1531 | if (pithy_print->can_print()) { |
1532 | + // the run time is not equals to stream time, | ||
1533 | + // @see: https://github.com/winlinvip/simple-rtmp-server/issues/81#issuecomment-48100994 | ||
1534 | + // it's ok. | ||
1499 | srs_trace("-> "SRS_LOG_ID_HLS | 1535 | srs_trace("-> "SRS_LOG_ID_HLS |
1500 | - " time=%"PRId64", dts=%"PRId64"(%"PRId64"ms), sequence_no=%d", | 1536 | + " time=%"PRId64", stream dts=%"PRId64"(%"PRId64"ms), sequence_no=%d", |
1501 | pithy_print->age(), stream_dts, stream_dts / 90, muxer->sequence_no()); | 1537 | pithy_print->age(), stream_dts, stream_dts / 90, muxer->sequence_no()); |
1502 | } | 1538 | } |
1503 | 1539 |
@@ -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 "0" | 32 | #define VERSION_MAJOR "0" |
33 | #define VERSION_MINOR "9" | 33 | #define VERSION_MINOR "9" |
34 | -#define VERSION_REVISION "151" | 34 | +#define VERSION_REVISION "152" |
35 | #define RTMP_SIG_SRS_VERSION VERSION_MAJOR"."VERSION_MINOR"."VERSION_REVISION | 35 | #define RTMP_SIG_SRS_VERSION VERSION_MAJOR"."VERSION_MINOR"."VERSION_REVISION |
36 | // server info. | 36 | // server info. |
37 | #define RTMP_SIG_SRS_KEY "SRS" | 37 | #define RTMP_SIG_SRS_KEY "SRS" |
-
请 注册 或 登录 后发表评论