mirror of
https://github.com/ossrs/srs.git
synced 2025-03-09 15:49:59 +00:00
* MP3: Fix bug for TS or HLS with mp3 codec. v4.0.269 (#296) 1. Refresh HLS audio codec if changed in stream. 2. Refresh TS audio codec if changed in stream. 3. Fix mp3 demux bug in SrsFormat::audio_mp3_demux. 4. Use 3(MPEG1) not 4(MPEG2) as PMT stream type, follow FFmpeg. 5. MP3: Update utest for mp3 sample parsing. 6. MP3: Ignore empty frame sample. 7. UTest: Fix utest failed, do not copy files.
This commit is contained in:
parent
2573a25101
commit
577cd299e1
10 changed files with 109 additions and 38 deletions
|
|
@ -202,6 +202,7 @@ SrsHlsMuxer::SrsHlsMuxer()
|
|||
async = new SrsAsyncCallWorker();
|
||||
context = new SrsTsContext();
|
||||
segments = new SrsFragmentWindow();
|
||||
latest_acodec_ = SrsAudioCodecIdForbidden;
|
||||
|
||||
memset(key, 0, 16);
|
||||
memset(iv, 0, 16);
|
||||
|
|
@ -263,6 +264,24 @@ int SrsHlsMuxer::deviation()
|
|||
return deviation_ts;
|
||||
}
|
||||
|
||||
SrsAudioCodecId SrsHlsMuxer::latest_acodec()
|
||||
{
|
||||
// If current context writer exists, we query from it.
|
||||
if (current && current->tscw) return current->tscw->acodec();
|
||||
|
||||
// Get the configured or updated config.
|
||||
return latest_acodec_;
|
||||
}
|
||||
|
||||
void SrsHlsMuxer::set_latest_acodec(SrsAudioCodecId v)
|
||||
{
|
||||
// Refresh the codec in context writer for current segment.
|
||||
if (current && current->tscw) current->tscw->set_acodec(v);
|
||||
|
||||
// Refresh the codec for future segments.
|
||||
latest_acodec_ = v;
|
||||
}
|
||||
|
||||
srs_error_t SrsHlsMuxer::initialize()
|
||||
{
|
||||
return srs_success;
|
||||
|
|
@ -371,6 +390,8 @@ srs_error_t SrsHlsMuxer::segment_open()
|
|||
srs_warn("hls: use aac for other codec=%s", default_acodec_str.c_str());
|
||||
}
|
||||
}
|
||||
// Now that we know the latest audio codec in stream, use it.
|
||||
if (latest_acodec_ != SrsAudioCodecIdForbidden) default_acodec = latest_acodec_;
|
||||
|
||||
// load the default vcodec from config.
|
||||
SrsVideoCodecId default_vcodec = SrsVideoCodecIdAVC;
|
||||
|
|
@ -963,6 +984,13 @@ srs_error_t SrsHlsController::on_sequence_header()
|
|||
srs_error_t SrsHlsController::write_audio(SrsAudioFrame* frame, int64_t pts)
|
||||
{
|
||||
srs_error_t err = srs_success;
|
||||
|
||||
// Refresh the codec ASAP.
|
||||
if (muxer->latest_acodec() != frame->acodec()->id) {
|
||||
srs_trace("HLS: Switch audio codec %d(%s) to %d(%s)", muxer->latest_acodec(), srs_audio_codec_id2str(muxer->latest_acodec()).c_str(),
|
||||
frame->acodec()->id, srs_audio_codec_id2str(frame->acodec()->id).c_str());
|
||||
muxer->set_latest_acodec(frame->acodec()->id);
|
||||
}
|
||||
|
||||
// write audio to cache.
|
||||
if ((err = tsmc->cache_audio(frame, pts)) != srs_success) {
|
||||
|
|
|
|||
|
|
@ -156,6 +156,9 @@ private:
|
|||
SrsHlsSegment* current;
|
||||
// The ts context, to keep cc continous between ts.
|
||||
SrsTsContext* context;
|
||||
private:
|
||||
// Latest audio codec, parsed from stream.
|
||||
SrsAudioCodecId latest_acodec_;
|
||||
public:
|
||||
SrsHlsMuxer();
|
||||
virtual ~SrsHlsMuxer();
|
||||
|
|
@ -166,6 +169,9 @@ public:
|
|||
virtual std::string ts_url();
|
||||
virtual srs_utime_t duration();
|
||||
virtual int deviation();
|
||||
public:
|
||||
SrsAudioCodecId latest_acodec();
|
||||
void set_latest_acodec(SrsAudioCodecId v);
|
||||
public:
|
||||
// Initialize the hls muxer.
|
||||
virtual srs_error_t initialize();
|
||||
|
|
|
|||
|
|
@ -773,7 +773,9 @@ void SrsLiveStream::http_hooks_on_stop(ISrsHttpMessage* r)
|
|||
srs_error_t SrsLiveStream::streaming_send_messages(ISrsBufferEncoder* enc, SrsSharedPtrMessage** msgs, int nb_msgs)
|
||||
{
|
||||
srs_error_t err = srs_success;
|
||||
|
||||
|
||||
// TODO: In gop cache, we know both the audio and video codec, so we should notice the encoder, which might depends
|
||||
// on setting the correct codec information, for example, HTTP-TS or HLS will write PMT.
|
||||
for (int i = 0; i < nb_msgs; i++) {
|
||||
SrsSharedPtrMessage* msg = msgs[i];
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue