Skip to content

Commit f9b7e6d

Browse files
committed
优化追踪策略,修复变调
1 parent 5cc7aa0 commit f9b7e6d

File tree

2 files changed

+28
-8
lines changed

2 files changed

+28
-8
lines changed

ijkmedia/ijkplayer/ff_ffplay.c

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1119,8 +1119,8 @@ static void sync_clock_to_slave(Clock *c, Clock *slave)
11191119
}
11201120

11211121
static int get_master_sync_type(VideoState *is) {
1122-
if (is->realtime)
1123-
return AV_SYNC_EXTERNAL_CLOCK;
1122+
// if (is->realtime)
1123+
// return AV_SYNC_EXTERNAL_CLOCK;
11241124
if (is->av_sync_type == AV_SYNC_VIDEO_MASTER) {
11251125
if (is->video_st)
11261126
return AV_SYNC_VIDEO_MASTER;
@@ -1155,7 +1155,7 @@ static double get_master_clock(VideoState *is)
11551155
return val;
11561156
}
11571157

1158-
static void check_external_clock_speed(VideoState *is) {
1158+
static void check_external_clock_speed(VideoState *is, FFPlayer *ffp) {
11591159
#if 0
11601160
if ((is->video_stream >= 0 && is->videoq.nb_packets <= EXTERNAL_CLOCK_MIN_FRAMES) ||
11611161
(is->audio_stream >= 0 && is->audioq.nb_packets <= EXTERNAL_CLOCK_MIN_FRAMES)) {
@@ -1168,7 +1168,10 @@ static void check_external_clock_speed(VideoState *is) {
11681168
if (speed != 1.0)
11691169
set_clock_speed(&is->extclk, speed + EXTERNAL_CLOCK_SPEED_STEP * (1.0 - speed) / fabs(1.0 - speed));
11701170
}
1171-
#else
1171+
#endif
1172+
1173+
#if 0
1174+
//#else
11721175
if (is->video_stream > 0 && is->videoq.nb_packets > EXTERNAL_CLOCK_MAX_FRAMES) {
11731176
set_clock_speed(&is->extclk, FFMIN(EXTERNAL_CLOCK_SPEED_MAX, is->extclk.speed + EXTERNAL_CLOCK_SPEED_STEP_UP));
11741177
} else {
@@ -1177,6 +1180,21 @@ static void check_external_clock_speed(VideoState *is) {
11771180
set_clock_speed(&is->extclk, speed + EXTERNAL_CLOCK_SPEED_STEP * (1.0 - speed) / fabs(1.0 - speed));
11781181
}
11791182
#endif
1183+
if (is->videoq.nb_packets > EXTERNAL_CLOCK_MAX_FRAMES) {
1184+
1185+
int synctype = get_master_sync_type(is);
1186+
if (synctype == AV_SYNC_AUDIO_MASTER) {
1187+
// printf("speeddddddd===audio===packets===>%d\n",is->videoq.nb_packets);
1188+
ffp_set_playback_rate(ffp, EXTERNAL_CLOCK_SPEED_MAX);
1189+
}else {
1190+
// printf("speeddddddd===exter===packets===>%d\n",is->videoq.nb_packets);
1191+
set_clock_speed(&is->extclk, EXTERNAL_CLOCK_SPEED_MAX);
1192+
}
1193+
}else {
1194+
ffp_set_playback_rate(ffp, 1);
1195+
set_clock_speed(&is->extclk, 1);
1196+
}
1197+
//#endif
11801198
}
11811199

11821200
/* seek in the stream */
@@ -1324,8 +1342,8 @@ static void video_refresh(FFPlayer *opaque, double *remaining_time)
13241342

13251343
Frame *sp, *sp2;
13261344

1327-
if (!is->paused && get_master_sync_type(is) == AV_SYNC_EXTERNAL_CLOCK && is->realtime)
1328-
check_external_clock_speed(is);
1345+
if (!is->paused && (get_master_sync_type(is) == AV_SYNC_EXTERNAL_CLOCK || get_master_sync_type(is) == AV_SYNC_AUDIO_MASTER) && is->realtime)
1346+
check_external_clock_speed(is, ffp);
13291347

13301348
if (!ffp->display_disable && is->show_mode != SHOW_MODE_VIDEO && is->audio_st) {
13311349
time = av_gettime_relative() / 1000000.0;
@@ -2663,6 +2681,8 @@ static void sdl_audio_callback(void *opaque, Uint8 *stream, int len)
26632681
SDL_AoutSetPlaybackRate(ffp->aout, ffp->pf_playback_rate);
26642682
#endif
26652683
}
2684+
// printf("mmmmmmmmm===>%f\n",ffp->pf_playback_rate);
2685+
26662686
if (ffp->pf_playback_volume_changed) {
26672687
ffp->pf_playback_volume_changed = 0;
26682688
SDL_AoutSetPlaybackVolume(ffp->aout, ffp->pf_playback_volume);
@@ -3300,7 +3320,7 @@ static int read_thread(void *arg)
33003320
if (st_index[AVMEDIA_TYPE_AUDIO] >= 0) {
33013321
stream_component_open(ffp, st_index[AVMEDIA_TYPE_AUDIO]);
33023322
} else {
3303-
ffp->av_sync_type = AV_SYNC_VIDEO_MASTER;
3323+
ffp->av_sync_type = AV_SYNC_EXTERNAL_CLOCK;
33043324
is->av_sync_type = ffp->av_sync_type;
33053325
}
33063326

ijkmedia/ijkplayer/ff_ffplay_def.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@
9393
#define MAX_MIN_FRAMES 50000
9494
#define MIN_FRAMES (ffp->dcc.min_frames)
9595
#define EXTERNAL_CLOCK_MIN_FRAMES 0
96-
#define EXTERNAL_CLOCK_MAX_FRAMES 3
96+
#define EXTERNAL_CLOCK_MAX_FRAMES 5
9797

9898
/* Minimum SDL audio buffer size, in samples. */
9999
#define SDL_AUDIO_MIN_BUFFER_SIZE 512

0 commit comments

Comments
 (0)