Directorio de artículos
1. Pausar el proceso de activación
1. Llame a toggle_pause a través del evento desencadenante de SDL
2.toggle_pause llama a stream_toggle_pause
3.stream_toggle_pause modifica la variable de pausa
2. alternar_pausa
static void toggle_pause(VideoState *is)
{
stream_toggle_pause(is);
is->step = 0;
}
3. stream_toggle_pause
static void stream_toggle_pause(VideoState *is)
{
// 如果当前是暂停 -> 恢复播放
// 正常播放 -> 暂停
if (is->paused) {
// 当前是暂停,那这个时候进来这个函数就是要恢复播放
/* 恢复暂停状态时也需要恢复时钟,需要更新vidclk */
// 加上 暂停->恢复 经过的时间
is->frame_timer += av_gettime_relative() / 1000000.0 - is->vidclk.last_updated;
if (is->read_pause_return != AVERROR(ENOSYS)) {
is->vidclk.paused = 0;
}
// 设置时钟的意义,暂停状态下读取的是单纯pts
// 重新矫正video时钟
set_clock(&is->vidclk, get_clock(&is->vidclk), is->vidclk.serial);
}
set_clock(&is->extclk, get_clock(&is->extclk), is->extclk.serial);
// 切换 pause/resume 两种状态
is->paused = is->audclk.paused = is->vidclk.paused = is->extclk.paused = !is->paused;
printf("is->step = %d; stream_toggle_pause\n", is->step);
}
Esta función puede saber que si el estado actual se suspende, ingresará a la función if.
Eche un vistazo al flujo de la función if. Primero sabemos que
is->frame_timer += av_gettime_relative() / 1000000.0 - is->vidclk.last_updated;
Esto se basa en el anterior más el tiempo desde la pausa hasta el inicio.
set_clock(&is->vidclk, get_clock(&is->vidclk), is->vidclk.serial);
Cuando get_clock está en estado de pausa, obtiene los puntos del reloj.
set_clock(&is->extclk, get_clock(&is->extclk), is->extclk.serial);
Lo mismo ocurre con la configuración del reloj externo.
is->paused = is->audclk.paused = is->vidclk.paused = is->extclk.paused = !is->paused;
Simplemente invertir en pausa
Echa un vistazo a qué funciones afectarán estas 4 pausas
- video_refresh Si está en pausa y no hay una actualización forzada, esta función no se llamará. He dicho antes cuándo forzar la actualización, como modificar el tamaño de la ventana de ffplay.
- La pausa en read_thread solo será efectiva para las transmisiones de red. En otros casos, la pausa no afectará a read_thread, pero continuará leyendo datos y escribiéndolos en la cola.
- get_clock se llamará en get_master_clock, y si get_clock está en estado de pausa, devolverá pts directamente
- La función audio_decode_frame se verá afectada por la pausa y devolverá directamente -1. Luego, sdl_audio_callback emitirá un juicio después de recibirlo y luego generará los datos de silencio sin pausa.