播放视频时同时播放音频

This commit is contained in:
2024-02-27 14:26:22 +08:00
parent 800364ea78
commit c8578b1e37
5 changed files with 39 additions and 11 deletions

View File

@@ -29,8 +29,8 @@ int InitAudio(SDL_Window* window, SDL_Renderer* renderer, const char* targetFile
InitDecoder(targetFilePath, param);
window = SDL_CreateWindow("mp", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN);
renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
std::jthread(RequestAudioPacket, std::ref(param)).detach();
}
std::jthread(RequestAudioPacket, std::ref(param)).detach();
SDL_AudioSpec des;
des.freq = param.audioParam.codecCtx->sample_rate;
des.channels = param.audioParam.codecCtx->ch_layout.nb_channels;
@@ -55,7 +55,7 @@ int InitVideo(SDL_Window*& window, const char* targetFilepath, MediaParam& param
param.audioParam.isVideo = true;
InitAudio(nullptr, nullptr, nullptr, param);
//FIX: when app exited, the fmtCtx was freed, so need notify decode thread to stop decode and exit.
std::jthread(RequestVideoPacket, std::ref(param)).detach();
std::jthread(RequestMediaPacket, std::ref(param)).detach();
std::jthread(RequestVideoFrame, std::ref(param)).detach();
const int client_width = param.videoParam.width / 2;
const int client_height = param.videoParam.height / 2;
@@ -221,7 +221,7 @@ int main(int argc, char** argv)
case FileType::VIDEO:
{
InitVideo(window, targetFilepath, mediaParam, openglVideoParam, shaderService);
const auto stream_frame_rate = mediaParam.fmtCtx->streams[mediaParam.videoParam.videoStreamIndex]->avg_frame_rate;
const auto stream_frame_rate = mediaParam.videoParam.stream->avg_frame_rate;
framerate = static_cast<double>(stream_frame_rate.den) / stream_frame_rate.num;
break;
}
@@ -272,7 +272,7 @@ int main(int argc, char** argv)
case FileType::VIDEO:
OpenglRenderVideo(mediaParam, openglVideoParam, shaderService);
SDL_GL_SwapWindow(window);
std::this_thread::sleep_until(current_time + std::chrono::milliseconds(30));
std::this_thread::sleep_until(current_time + std::chrono::milliseconds(static_cast<int>(framerate * 1000)));
current_time = std::chrono::system_clock::now();
break;
case FileType::IMG: