static int stream_component_open(VideoState *is, int stream_index) { //依照编解码上下文的codec_id,遍历编解码器链表,找到相应的解码器 codec = avcodec_find_decoder(enc->codec_id); //打开编解码器,初始化具体编解码器的运行环境。 if (!codec || avcodec_open(enc, codec) < 0) return -1; switch(enc->codec_type) { /* prepare audio */ case CODEC_TYPE_AUDIO: //初始化音频队列 packet_queue_init(&is->audioq); //启动广义的音频解码线程。 wanted_spec.callback = sdl_audio_callback; wanted_spec.userdata = is; if (SDL_OpenAudio(&wanted_spec, &spec) < 0) { fprintf(stderr, "SDL_OpenAudio: %s\n", SDL_GetError()); return -1; } SDL_PauseAudio(0); break; case CODEC_TYPE_VIDEO: //初始化视频队列 packet_queue_init(&is->videoq); //启动视频解码线程 is->video_tid = SDL_CreateThread(video_thread, is); break; case CODEC_TYPE_SUBTITLE: packet_queue_init(&is->subtitleq); is->subtitle_tid = SDL_CreateThread(subtitle_thread, is); break; default: break; } return 0; }