Diretório de artigos
1. Pause o processo de gatilho
1. Chame toggle_pause por meio do evento de gatilho SDL
2.toggle_pause chama stream_toggle_pause
3.stream_toggle_pause modifica a variável 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 função pode saber que se o estado atual for suspenso, ela entrará na função if
Dê uma olhada no fluxo da função if. Primeiro sabemos que
is->frame_timer += av_gettime_relative() / 1000000.0 - is->vidclk.last_updated;
Isso se baseia no anterior mais o tempo desde a pausa até o início.
set_clock(&is->vidclk, get_clock(&is->vidclk), is->vidclk.serial);
Quando get_clock está no estado pausado, ele obtém os pontos do relógio.
set_clock(&is->extclk, get_clock(&is->extclk), is->extclk.serial);
O mesmo se aplica ao ajuste do relógio externo
is->paused = is->audclk.paused = is->vidclk.paused = is->extclk.paused = !is->paused;
Apenas inverter pausado
Dê uma olhada em quais funções essas 4 pausas afetarão
- video_refresh Se estiver pausado e não houver atualização forçada, esta função não será chamada. Já disse quando forçar a atualização, como modificar o tamanho da janela do ffplay.
- A pausa em read_thread só será eficaz para fluxos de rede. Em outros casos, a pausa não afetará read_thread, mas continuará a ler os dados e gravá-los na fila.
- get_clock será chamado em get_master_clock e se get_clock estiver no estado pausado, ele retornará diretamente pts
- A função audio_decode_frame será afetada pela pausa e retornará diretamente -1. Em seguida, sdl_audio_callback fará um julgamento após recebê-lo e, em seguida, emitirá os dados mudos sem pausa.