diff --git a/config.cpp b/config.cpp index 809d099..b862413 100644 --- a/config.cpp +++ b/config.cpp @@ -83,3 +83,19 @@ int Config::LoggingLevel() { return AV_LOG_INFO; } } + +uint32_t Config::AudioBuffer() { + auto re = configs.find("audioBuffer"); + if (re == configs.end()) { + return 0; + } + return std::stoul((*re).second); +} + +uint32_t Config::VideoBuffer() { + auto re = configs.find("videoBuffer"); + if (re == configs.end()) { + return 0; + } + return std::stoul((*re).second); +} diff --git a/config.hpp b/config.hpp index d9b9b77..de63e26 100644 --- a/config.hpp +++ b/config.hpp @@ -10,8 +10,12 @@ class Config { configs["appendLogging"] = "false"; configs["loggingFile"] = ""; configs["loggingLevel"] = "info"; + configs["audioBuffer"] = "0"; + configs["videoBuffer"] = "0"; } bool Load(std::string path); bool IsAppendLogging(); int LoggingLevel(); + uint32_t AudioBuffer(); + uint32_t VideoBuffer(); }; diff --git a/dllmain.cpp b/dllmain.cpp index 5a9de45..3608941 100644 --- a/dllmain.cpp +++ b/dllmain.cpp @@ -124,6 +124,15 @@ int64_t HookedOpenMediaFileAndGetDuration(DWORD* duration, const char* arcName, player_log(AV_LOG_ERROR, "Failed to initialize player settings.\n"); goto end; } + player_settings_set_resize(settings, 0); + uint32_t audioBuffer = config.AudioBuffer(); + if (audioBuffer) { + player_settings_set_audio_buffer_size(settings, audioBuffer); + } + uint32_t videoBuffer = config.VideoBuffer(); + if (videoBuffer) { + player_settings_set_video_buffer_size(settings, videoBuffer); + } } player_settings_set_hWnd(settings, (void**)GetHwndPointer()); if (player_create2(videoName, &player, settings)) { @@ -134,6 +143,7 @@ int64_t HookedOpenMediaFileAndGetDuration(DWORD* duration, const char* arcName, player_log(AV_LOG_ERROR, "Failed to initialize player.\n"); goto end; } + player_wait_until_buffer_is_full(player); if (player_play(player)) { player_log(AV_LOG_ERROR, "Failed to play video.\n"); goto end; diff --git a/include/player.h b/include/player.h index f34a979..d3afc39 100644 --- a/include/player.h +++ b/include/player.h @@ -116,6 +116,17 @@ PLAYER_API int player_play(PlayerSession* session); * @return 错误代码 */ PLAYER_API int player_pause(PlayerSession* session); +/** + * @brief 判断播放器缓冲区是否已满 + * @param session 播放器会话指针 + * @return 是否已满 + */ +PLAYER_API int player_buffer_is_full(PlayerSession* session); +/** + * @brief 等待播放器缓冲区满 + * @param session 播放器会话指针 + */ +PLAYER_API void player_wait_until_buffer_is_full(PlayerSession* session); /** * @brief 判断播放器是否正在播放 * @param session 播放器会话指针 @@ -147,6 +158,18 @@ PLAYER_API void player_settings_default(PlayerSettings* settings); * @param resize 是否自动调整窗口大小 */ PLAYER_API void player_settings_set_resize(PlayerSettings* settings, unsigned char resize); +/** + * @brief 设置音频缓冲区大小 + * @param settings 播放器设置指针 + * @param size 音频缓冲区大小(单位 ms) +*/ +PLAYER_API void player_settings_set_audio_buffer_size(PlayerSettings* settings, uint32_t size); +/** + * @brief 设置视频缓冲区大小 + * @param settings 播放器设置指针 + * @param size 视频缓冲区大小(单位 ms) +*/ +PLAYER_API void player_settings_set_video_buffer_size(PlayerSettings* settings, uint32_t size); /** * @brief 设置窗口句柄 * @param settings 播放器设置指针 diff --git a/lib/player.lib b/lib/player.lib index f8ceeb5..818494d 100644 Binary files a/lib/player.lib and b/lib/player.lib differ