正在显示
2 个修改的文件
包含
26 行增加
和
13 行删除
| @@ -68,11 +68,11 @@ int SrsConsumer::get_time() | @@ -68,11 +68,11 @@ int SrsConsumer::get_time() | ||
| 68 | return (int)last_pkt_correct_time; | 68 | return (int)last_pkt_correct_time; |
| 69 | } | 69 | } |
| 70 | 70 | ||
| 71 | -int SrsConsumer::enqueue(SrsSharedPtrMessage* msg, int audio_sample_rate) | 71 | +int SrsConsumer::enqueue(SrsSharedPtrMessage* msg, int audio_sample_rate, int video_frame_rate) |
| 72 | { | 72 | { |
| 73 | int ret = ERROR_SUCCESS; | 73 | int ret = ERROR_SUCCESS; |
| 74 | 74 | ||
| 75 | - if ((ret = jitter_correct(msg, audio_sample_rate)) != ERROR_SUCCESS) { | 75 | + if ((ret = jitter_correct(msg, audio_sample_rate, video_frame_rate)) != ERROR_SUCCESS) { |
| 76 | return ret; | 76 | return ret; |
| 77 | } | 77 | } |
| 78 | 78 | ||
| @@ -179,7 +179,7 @@ void SrsConsumer::shrink() | @@ -179,7 +179,7 @@ void SrsConsumer::shrink() | ||
| 179 | } | 179 | } |
| 180 | } | 180 | } |
| 181 | 181 | ||
| 182 | -int SrsConsumer::jitter_correct(SrsSharedPtrMessage* msg, int audio_sample_rate) | 182 | +int SrsConsumer::jitter_correct(SrsSharedPtrMessage* msg, int audio_sample_rate, int video_frame_rate) |
| 183 | { | 183 | { |
| 184 | int ret = ERROR_SUCCESS; | 184 | int ret = ERROR_SUCCESS; |
| 185 | 185 | ||
| @@ -201,6 +201,8 @@ int SrsConsumer::jitter_correct(SrsSharedPtrMessage* msg, int audio_sample_rate) | @@ -201,6 +201,8 @@ int SrsConsumer::jitter_correct(SrsSharedPtrMessage* msg, int audio_sample_rate) | ||
| 201 | // calc the right diff by audio sample rate | 201 | // calc the right diff by audio sample rate |
| 202 | if (msg->header.is_audio() && audio_sample_rate > 0) { | 202 | if (msg->header.is_audio() && audio_sample_rate > 0) { |
| 203 | delta = (int32_t)(delta * 1000.0 / audio_sample_rate); | 203 | delta = (int32_t)(delta * 1000.0 / audio_sample_rate); |
| 204 | + } else if (msg->header.is_video() && video_frame_rate > 0) { | ||
| 205 | + delta = (int32_t)(delta * 1.0 / video_frame_rate); | ||
| 204 | } else { | 206 | } else { |
| 205 | delta = DEFAULT_FRAME_TIME_MS; | 207 | delta = DEFAULT_FRAME_TIME_MS; |
| 206 | } | 208 | } |
| @@ -244,7 +246,7 @@ SrsSource::SrsSource(std::string _stream_url) | @@ -244,7 +246,7 @@ SrsSource::SrsSource(std::string _stream_url) | ||
| 244 | cached_video_count = 0; | 246 | cached_video_count = 0; |
| 245 | enable_gop_cache = true; | 247 | enable_gop_cache = true; |
| 246 | 248 | ||
| 247 | - audio_sample_rate = 0; | 249 | + video_frame_rate = audio_sample_rate = 0; |
| 248 | } | 250 | } |
| 249 | 251 | ||
| 250 | SrsSource::~SrsSource() | 252 | SrsSource::~SrsSource() |
| @@ -278,6 +280,11 @@ int SrsSource::on_meta_data(SrsCommonMessage* msg, SrsOnMetaDataPacket* metadata | @@ -278,6 +280,11 @@ int SrsSource::on_meta_data(SrsCommonMessage* msg, SrsOnMetaDataPacket* metadata | ||
| 278 | audio_sample_rate = (int)(srs_amf0_convert<SrsAmf0Number>(prop)->value); | 280 | audio_sample_rate = (int)(srs_amf0_convert<SrsAmf0Number>(prop)->value); |
| 279 | } | 281 | } |
| 280 | } | 282 | } |
| 283 | + if ((prop = metadata->metadata->get_property("framerate")) != NULL) { | ||
| 284 | + if (prop->is_number()) { | ||
| 285 | + video_frame_rate = (int)(srs_amf0_convert<SrsAmf0Number>(prop)->value); | ||
| 286 | + } | ||
| 287 | + } | ||
| 281 | 288 | ||
| 282 | // encode the metadata to payload | 289 | // encode the metadata to payload |
| 283 | int size = metadata->get_payload_length(); | 290 | int size = metadata->get_payload_length(); |
| @@ -311,7 +318,7 @@ int SrsSource::on_meta_data(SrsCommonMessage* msg, SrsOnMetaDataPacket* metadata | @@ -311,7 +318,7 @@ int SrsSource::on_meta_data(SrsCommonMessage* msg, SrsOnMetaDataPacket* metadata | ||
| 311 | std::vector<SrsConsumer*>::iterator it; | 318 | std::vector<SrsConsumer*>::iterator it; |
| 312 | for (it = consumers.begin(); it != consumers.end(); ++it) { | 319 | for (it = consumers.begin(); it != consumers.end(); ++it) { |
| 313 | SrsConsumer* consumer = *it; | 320 | SrsConsumer* consumer = *it; |
| 314 | - if ((ret = consumer->enqueue(cache_metadata->copy(), audio_sample_rate)) != ERROR_SUCCESS) { | 321 | + if ((ret = consumer->enqueue(cache_metadata->copy(), audio_sample_rate, video_frame_rate)) != ERROR_SUCCESS) { |
| 315 | srs_error("dispatch the metadata failed. ret=%d", ret); | 322 | srs_error("dispatch the metadata failed. ret=%d", ret); |
| 316 | return ret; | 323 | return ret; |
| 317 | } | 324 | } |
| @@ -341,7 +348,7 @@ int SrsSource::on_audio(SrsCommonMessage* audio) | @@ -341,7 +348,7 @@ int SrsSource::on_audio(SrsCommonMessage* audio) | ||
| 341 | std::vector<SrsConsumer*>::iterator it; | 348 | std::vector<SrsConsumer*>::iterator it; |
| 342 | for (it = consumers.begin(); it != consumers.end(); ++it) { | 349 | for (it = consumers.begin(); it != consumers.end(); ++it) { |
| 343 | SrsConsumer* consumer = *it; | 350 | SrsConsumer* consumer = *it; |
| 344 | - if ((ret = consumer->enqueue(msg->copy(), audio_sample_rate)) != ERROR_SUCCESS) { | 351 | + if ((ret = consumer->enqueue(msg->copy(), audio_sample_rate, video_frame_rate)) != ERROR_SUCCESS) { |
| 345 | srs_error("dispatch the audio failed. ret=%d", ret); | 352 | srs_error("dispatch the audio failed. ret=%d", ret); |
| 346 | return ret; | 353 | return ret; |
| 347 | } | 354 | } |
| @@ -385,7 +392,7 @@ int SrsSource::on_video(SrsCommonMessage* video) | @@ -385,7 +392,7 @@ int SrsSource::on_video(SrsCommonMessage* video) | ||
| 385 | std::vector<SrsConsumer*>::iterator it; | 392 | std::vector<SrsConsumer*>::iterator it; |
| 386 | for (it = consumers.begin(); it != consumers.end(); ++it) { | 393 | for (it = consumers.begin(); it != consumers.end(); ++it) { |
| 387 | SrsConsumer* consumer = *it; | 394 | SrsConsumer* consumer = *it; |
| 388 | - if ((ret = consumer->enqueue(msg->copy(), audio_sample_rate)) != ERROR_SUCCESS) { | 395 | + if ((ret = consumer->enqueue(msg->copy(), audio_sample_rate, video_frame_rate)) != ERROR_SUCCESS) { |
| 389 | srs_error("dispatch the video failed. ret=%d", ret); | 396 | srs_error("dispatch the video failed. ret=%d", ret); |
| 390 | return ret; | 397 | return ret; |
| 391 | } | 398 | } |
| @@ -416,19 +423,19 @@ int SrsSource::on_video(SrsCommonMessage* video) | @@ -416,19 +423,19 @@ int SrsSource::on_video(SrsCommonMessage* video) | ||
| 416 | consumer = new SrsConsumer(this); | 423 | consumer = new SrsConsumer(this); |
| 417 | consumers.push_back(consumer); | 424 | consumers.push_back(consumer); |
| 418 | 425 | ||
| 419 | - if (cache_metadata && (ret = consumer->enqueue(cache_metadata->copy(), audio_sample_rate)) != ERROR_SUCCESS) { | 426 | + if (cache_metadata && (ret = consumer->enqueue(cache_metadata->copy(), audio_sample_rate, video_frame_rate)) != ERROR_SUCCESS) { |
| 420 | srs_error("dispatch metadata failed. ret=%d", ret); | 427 | srs_error("dispatch metadata failed. ret=%d", ret); |
| 421 | return ret; | 428 | return ret; |
| 422 | } | 429 | } |
| 423 | srs_info("dispatch metadata success"); | 430 | srs_info("dispatch metadata success"); |
| 424 | 431 | ||
| 425 | - if (cache_sh_video && (ret = consumer->enqueue(cache_sh_video->copy(), audio_sample_rate)) != ERROR_SUCCESS) { | 432 | + if (cache_sh_video && (ret = consumer->enqueue(cache_sh_video->copy(), audio_sample_rate, video_frame_rate)) != ERROR_SUCCESS) { |
| 426 | srs_error("dispatch video sequence header failed. ret=%d", ret); | 433 | srs_error("dispatch video sequence header failed. ret=%d", ret); |
| 427 | return ret; | 434 | return ret; |
| 428 | } | 435 | } |
| 429 | srs_info("dispatch video sequence header success"); | 436 | srs_info("dispatch video sequence header success"); |
| 430 | 437 | ||
| 431 | - if (cache_sh_audio && (ret = consumer->enqueue(cache_sh_audio->copy(), audio_sample_rate)) != ERROR_SUCCESS) { | 438 | + if (cache_sh_audio && (ret = consumer->enqueue(cache_sh_audio->copy(), audio_sample_rate, video_frame_rate)) != ERROR_SUCCESS) { |
| 432 | srs_error("dispatch audio sequence header failed. ret=%d", ret); | 439 | srs_error("dispatch audio sequence header failed. ret=%d", ret); |
| 433 | return ret; | 440 | return ret; |
| 434 | } | 441 | } |
| @@ -437,7 +444,7 @@ int SrsSource::on_video(SrsCommonMessage* video) | @@ -437,7 +444,7 @@ int SrsSource::on_video(SrsCommonMessage* video) | ||
| 437 | std::vector<SrsSharedPtrMessage*>::iterator it; | 444 | std::vector<SrsSharedPtrMessage*>::iterator it; |
| 438 | for (it = gop_cache.begin(); it != gop_cache.end(); ++it) { | 445 | for (it = gop_cache.begin(); it != gop_cache.end(); ++it) { |
| 439 | SrsSharedPtrMessage* msg = *it; | 446 | SrsSharedPtrMessage* msg = *it; |
| 440 | - if ((ret = consumer->enqueue(msg->copy(), audio_sample_rate)) != ERROR_SUCCESS) { | 447 | + if ((ret = consumer->enqueue(msg->copy(), audio_sample_rate, video_frame_rate)) != ERROR_SUCCESS) { |
| 441 | srs_error("dispatch cached gop failed. ret=%d", ret); | 448 | srs_error("dispatch cached gop failed. ret=%d", ret); |
| 442 | return ret; | 449 | return ret; |
| 443 | } | 450 | } |
| @@ -62,8 +62,10 @@ public: | @@ -62,8 +62,10 @@ public: | ||
| 62 | virtual int get_time(); | 62 | virtual int get_time(); |
| 63 | /** | 63 | /** |
| 64 | * enqueue an shared ptr message. | 64 | * enqueue an shared ptr message. |
| 65 | + * @param audio_sample_rate used to calc the audio time delta if time-jitter detected. | ||
| 66 | + * @param video_frame_rate used to calc the video time delta if time-jitter detected. | ||
| 65 | */ | 67 | */ |
| 66 | - virtual int enqueue(SrsSharedPtrMessage* msg, int audio_sample_rate); | 68 | + virtual int enqueue(SrsSharedPtrMessage* msg, int audio_sample_rate, int video_frame_rate); |
| 67 | /** | 69 | /** |
| 68 | * get packets in consumer queue. | 70 | * get packets in consumer queue. |
| 69 | * @pmsgs SrsMessages*[], output the prt array. | 71 | * @pmsgs SrsMessages*[], output the prt array. |
| @@ -84,7 +86,7 @@ private: | @@ -84,7 +86,7 @@ private: | ||
| 84 | /** | 86 | /** |
| 85 | * detect the time jitter and correct it. | 87 | * detect the time jitter and correct it. |
| 86 | */ | 88 | */ |
| 87 | - virtual int jitter_correct(SrsSharedPtrMessage* msg, int audio_sample_rate); | 89 | + virtual int jitter_correct(SrsSharedPtrMessage* msg, int audio_sample_rate, int video_frame_rate); |
| 88 | virtual void clear(); | 90 | virtual void clear(); |
| 89 | }; | 91 | }; |
| 90 | 92 | ||
| @@ -128,6 +130,10 @@ private: | @@ -128,6 +130,10 @@ private: | ||
| 128 | * the sample rate of audio in metadata. | 130 | * the sample rate of audio in metadata. |
| 129 | */ | 131 | */ |
| 130 | int audio_sample_rate; | 132 | int audio_sample_rate; |
| 133 | + /** | ||
| 134 | + * the video frame rate in metadata. | ||
| 135 | + */ | ||
| 136 | + int video_frame_rate; | ||
| 131 | private: | 137 | private: |
| 132 | SrsSharedPtrMessage* cache_metadata; | 138 | SrsSharedPtrMessage* cache_metadata; |
| 133 | // the cached video sequence header. | 139 | // the cached video sequence header. |
-
请 注册 或 登录 后发表评论