Browse Source

Z991239-3624 #comment 解决音频播放存在杂音问题

80274480 3 years ago
parent
commit
f187148c15

+ 6 - 4
Other/libmediaplayer/audio.cpp

@@ -105,9 +105,12 @@ static int audio_decode_thread(void *arg)
 
 	while (false == is->buser_stop)
     {
-        got_frame = audio_decode_frame(is->p_acodec_ctx[is->icurrent_index], &is->audio_pkt_queue, p_frame, is->rvc_hostapi);
+        got_frame = audio_decode_frame(is->p_acodec_ctx[is->iaudio_dec_index], &is->audio_pkt_queue, p_frame, is->rvc_hostapi);
         if (got_frame < 0){
 			if(-2 == got_frame && inullpacket < 2){
+				if (is->icurrent_index > is->iaudio_dec_index) {
+					is->iaudio_dec_index++;
+				}
 				inullpacket++;
 				continue;
 			}
@@ -348,9 +351,9 @@ static int open_audio_playing(void *arg)
 	SDL_AudioSpec wanted_spec = {0};
 	SDL_AudioSpec actual_spec = {0};
 
-    wanted_spec.freq = is->p_acodec_ctx[is->icurrent_index]->sample_rate;   // 采样率
+    wanted_spec.freq = is->p_acodec_ctx[is->iaudio_dec_index]->sample_rate;   // 采样率
     wanted_spec.format = AUDIO_S16SYS;                  // S表带符号,16是采样深度,SYS表采用系统字节序
-    wanted_spec.channels = is->p_acodec_ctx[is->icurrent_index]->channels;  // 声音通道数
+    wanted_spec.channels = is->p_acodec_ctx[is->iaudio_dec_index]->channels;  // 声音通道数
     wanted_spec.silence = 0;                            // 静音值
     // wanted_spec.samples = SDL_AUDIO_BUFFER_SIZE;     // SDL声音缓冲区尺寸,单位是单声道采样点尺寸x通道数
     // SDL声音缓冲区尺寸,单位是单声道采样点尺寸x声道数
@@ -518,7 +521,6 @@ int open_audio(player_stat_t *is)
 	is->rvc_hostapi->Debug(MEDIA_LOG_DEBUG, "enter open_audio()");
 	if (-1 == is->audio_idx[is->icurrent_index]){
 		is->rvc_hostapi->Debug(MEDIA_LOG_DEBUG, "not find audio stream");
-		//is->baudio_finished = true;
 	}
 	else {
 		open_audio_stream(is);

+ 4 - 9
Other/libmediaplayer/demux.cpp

@@ -111,13 +111,12 @@ static int demux_thread(void *arg)
     //AVFormatContext *p_fmt_ctx = is->p_fmt_ctx;
     int ret = 0;
     AVPacket pkt1, *pkt = &pkt1;
-	static int icount = 0;
 
     SDL_mutex *wait_mutex = SDL_CreateMutex();
 
 	is->rvc_hostapi->Debug(MEDIA_LOG_DEBUG, "begin %s av_read_frame, nFilecount is %d. current index is %d.", is->strPlayLists[is->icurrent_index], is->uFilesCount, is->icurrent_index);
     // 4. 解复用处理
-	while (false == is->buser_stop /*false == is->baudio_finished || false == is->bvideo_finished*/)
+	while (false == is->buser_stop)
     {
         /* if the queue are full, no need to read more */
         if (is->audio_pkt_queue.packet_queue_size + is->video_pkt_queue.packet_queue_size > MAX_QUEUE_SIZE ||
@@ -135,13 +134,13 @@ static int demux_thread(void *arg)
         ret = av_read_frame(is->p_fmt_ctx[is->icurrent_index], pkt);
         if (ret < 0)
         {
-            if ((ret == AVERROR_EOF))// || avio_feof(ic->pb)) && !is->eof)
+            if (AVERROR_EOF == ret)
             {
                 // 输入文件已读完,则往packet队列中发送NULL packet,以冲洗(flush)解码器,否则解码器中缓存的帧取不出来
-                if (is->video_idx >= 0){
+                if (is->video_idx[is->icurrent_index] >= 0){
                     packet_queue_put_nullpacket(&is->video_pkt_queue, is->video_idx[is->icurrent_index], is->rvc_hostapi);
                 }
-                if (is->audio_idx >= 0){
+                if (is->audio_idx[is->icurrent_index] >= 0){
                     packet_queue_put_nullpacket(&is->audio_pkt_queue, is->audio_idx[is->icurrent_index], is->rvc_hostapi);
                 }
 
@@ -152,10 +151,6 @@ static int demux_thread(void *arg)
 				}
 				else {
 					is->rvc_hostapi->Debug(MEDIA_LOG_DEBUG, "av_read_frame ret is AVERROR_EOF.");
-					//icount++;
-					//if (icount > 3){
-					//	break;
-					//}
 					break;
 				}
             }

+ 14 - 7
Other/libmediaplayer/player.cpp

@@ -223,9 +223,7 @@ int CMediaPlayer::Initialize_Player_Stat(rvc_media_player_param_t* pMedia_Player
 		m_hostapi->Debug(MEDIA_LOG_DEBUG, "player_stat_t struct malloc failed!");
 		return iRet;
 	}
-	//m_player_stat->baudio_finished = false;
-	//m_player_stat->bvideo_finished = false;
-	//m_player_stat->bread_finished = false;
+
 	m_player_stat->buser_stop = false;
 	m_player_stat->rvc_hostapi = m_hostapi;
 	m_player_stat->prvc_cb = pMedia_Player->cb;
@@ -248,9 +246,12 @@ int CMediaPlayer::Initialize_Player_Stat(rvc_media_player_param_t* pMedia_Player
 	}
 	m_player_stat->uVolume = m_uvolume;
 	m_player_stat->uFilesCount = pMedia_Player->uFilesCount;
+	m_player_stat->icurrent_index = 0;
+	m_player_stat->iaudio_dec_index = 0;
 	for (size_t i = 0; i < pMedia_Player->uFilesCount; i++){
 		memcpy(m_player_stat->strPlayLists[i], pMedia_Player->strPlayLists[i], strlen(pMedia_Player->strPlayLists[i]));
 	}
+
 	if (0 == pMedia_Player->uFilesCount || NULL == m_player_stat->rvc_hostapi || NULL == m_player_stat->prvc_cb || NULL == m_player_stat->piconpath) {
 		UnInitialize_Player_Stat();
 		return iRet;
@@ -270,6 +271,12 @@ int CMediaPlayer::UnInitialize_Player_Stat()
 		return -1;
 	}
 
+	packet_queue_abort(&m_player_stat->video_pkt_queue, m_hostapi);
+	packet_queue_abort(&m_player_stat->audio_pkt_queue, m_hostapi);
+
+	frame_queue_signal(&m_player_stat->video_frm_queue);
+	frame_queue_signal(&m_player_stat->audio_frm_queue);
+
 	//if (NULL != m_player_stat->audio_decode_tid) {
 	//	SDL_WaitThread(m_player_stat->audio_decode_tid, NULL);
 	//	m_player_stat->audio_decode_tid = NULL;
@@ -501,11 +508,11 @@ int CMediaPlayer::StartMediaPlay()
 
 	m_hostapi->Debug(MEDIA_LOG_DEBUG, "after open_audio function.");
 
-	packet_queue_abort(&m_player_stat->video_pkt_queue, m_hostapi);
-	packet_queue_abort(&m_player_stat->audio_pkt_queue, m_hostapi);
+	//packet_queue_abort(&m_player_stat->video_pkt_queue, m_hostapi);
+	//packet_queue_abort(&m_player_stat->audio_pkt_queue, m_hostapi);
 
-	frame_queue_signal(&m_player_stat->video_frm_queue);
-	frame_queue_signal(&m_player_stat->audio_frm_queue);
+	//frame_queue_signal(&m_player_stat->video_frm_queue);
+	//frame_queue_signal(&m_player_stat->audio_frm_queue);
 
 	if (NULL != m_player_stat->audio_decode_tid) {
 		SDL_WaitThread(m_player_stat->audio_decode_tid, NULL);

+ 3 - 6
Other/libmediaplayer/player.h

@@ -167,7 +167,6 @@ typedef enum eWindType_s {
 }eWindType_t;
 
 typedef struct player_stat_s{
-
     AVFormatContext *p_fmt_ctx[MAX_FILECOUNT];
     AVStream *p_audio_stream[MAX_FILECOUNT];
     AVStream *p_video_stream[MAX_FILECOUNT];
@@ -209,9 +208,6 @@ typedef struct player_stat_s{
     int paused;
     int step;
 
-	//volatile bool baudio_finished;
-	//volatile bool bvideo_finished;
-	//volatile bool bread_finished;
 	volatile bool buser_stop;
 
     SDL_cond *continue_read_thread;
@@ -234,8 +230,9 @@ typedef struct player_stat_s{
 	CMediaHostApi* rvc_hostapi;
 	
 	char strPlayLists[MAX_FILECOUNT][MAX_PATH];		//播放列表,全路径
-	uint8_t uFilesCount;								//播放文件数
-	volatile int icurrent_index;								//当前播放文件索引
+	uint8_t uFilesCount;							//播放文件数
+	volatile int icurrent_index;					//当前播放文件索引
+	volatile int iaudio_dec_index;					//当前音频解码器索引
 	bool bCirclePlay;
 	bool bvice_monitor;
 	int iDisplayCx;