Fix crash issue when exit test_player

This commit is contained in:
xiongziliang 2024-02-07 22:40:41 +08:00
parent 4d28b99780
commit 306a32131c

View File

@ -10,6 +10,7 @@
#include <signal.h> #include <signal.h>
#include "Util/logger.h" #include "Util/logger.h"
#include "Util/util.h"
#include <iostream> #include <iostream>
#include "Common/config.h" #include "Common/config.h"
#include "Rtsp/UDPServer.h" #include "Rtsp/UDPServer.h"
@ -48,9 +49,10 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstanc, LPSTR lpCmdLine,
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
#endif #endif
static char *url = argv[1]; static char *url = argv[1];
//设置退出信号处理函数 {
// 设置退出信号处理函数
signal(SIGINT, [](int) { SDLDisplayerHelper::Instance().shutdown(); }); signal(SIGINT, [](int) { SDLDisplayerHelper::Instance().shutdown(); });
//设置日志 // 设置日志
Logger::Instance().add(std::make_shared<ConsoleChannel>()); Logger::Instance().add(std::make_shared<ConsoleChannel>());
Logger::Instance().setWriter(std::make_shared<AsyncLogWriter>()); Logger::Instance().setWriter(std::make_shared<AsyncLogWriter>());
@ -61,7 +63,7 @@ int main(int argc, char *argv[]) {
} }
auto player = std::make_shared<MediaPlayer>(); auto player = std::make_shared<MediaPlayer>();
//sdl要求在main线程初始化 // sdl要求在main线程初始化
auto displayer = std::make_shared<YuvDisplayer>(nullptr, url); auto displayer = std::make_shared<YuvDisplayer>(nullptr, url);
weak_ptr<MediaPlayer> weakPlayer = player; weak_ptr<MediaPlayer> weakPlayer = player;
player->setOnPlayResult([weakPlayer, displayer](const SockException &ex) { player->setOnPlayResult([weakPlayer, displayer](const SockException &ex) {
@ -72,56 +74,51 @@ int main(int argc, char *argv[]) {
} }
auto videoTrack = dynamic_pointer_cast<VideoTrack>(strongPlayer->getTrack(TrackVideo, false)); auto videoTrack = dynamic_pointer_cast<VideoTrack>(strongPlayer->getTrack(TrackVideo, false));
auto audioTrack = dynamic_pointer_cast<AudioTrack>(strongPlayer->getTrack(TrackAudio,false)); auto audioTrack = dynamic_pointer_cast<AudioTrack>(strongPlayer->getTrack(TrackAudio, false));
if (videoTrack) { if (videoTrack) {
auto decoder = std::make_shared<FFmpegDecoder>(videoTrack); auto decoder = std::make_shared<FFmpegDecoder>(videoTrack);
decoder->setOnDecode([displayer](const FFmpegFrame::Ptr &yuv) { decoder->setOnDecode([displayer](const FFmpegFrame::Ptr &yuv) {
SDLDisplayerHelper::Instance().doTask([yuv, displayer]() { SDLDisplayerHelper::Instance().doTask([yuv, displayer]() {
//sdl要求在main线程渲染 // sdl要求在main线程渲染
displayer->displayYUV(yuv->get()); displayer->displayYUV(yuv->get());
return true; return true;
}); });
}); });
videoTrack->addDelegate([decoder](const Frame::Ptr &frame) { videoTrack->addDelegate([decoder](const Frame::Ptr &frame) { return decoder->inputFrame(frame, false, true); });
return decoder->inputFrame(frame, false, true);
});
} }
if (audioTrack) { if (audioTrack) {
auto decoder = std::make_shared<FFmpegDecoder>(audioTrack); auto decoder = std::make_shared<FFmpegDecoder>(audioTrack);
auto audio_player = std::make_shared<AudioPlayer>(); auto audio_player = std::make_shared<AudioPlayer>();
//FFmpeg解码时已经统一转换为16位整型pcm // FFmpeg解码时已经统一转换为16位整型pcm
audio_player->setup(audioTrack->getAudioSampleRate(), audioTrack->getAudioChannel(), AUDIO_S16); audio_player->setup(audioTrack->getAudioSampleRate(), audioTrack->getAudioChannel(), AUDIO_S16);
FFmpegSwr::Ptr swr; FFmpegSwr::Ptr swr;
decoder->setOnDecode([audio_player, swr](const FFmpegFrame::Ptr &frame) mutable{ decoder->setOnDecode([audio_player, swr](const FFmpegFrame::Ptr &frame) mutable {
if (!swr) { if (!swr) {
swr = std::make_shared<FFmpegSwr>(AV_SAMPLE_FMT_S16, frame->get()->channels, swr = std::make_shared<FFmpegSwr>(AV_SAMPLE_FMT_S16, frame->get()->channels, frame->get()->channel_layout, frame->get()->sample_rate);
frame->get()->channel_layout, frame->get()->sample_rate);
} }
auto pcm = swr->inputFrame(frame); auto pcm = swr->inputFrame(frame);
auto len = pcm->get()->nb_samples * pcm->get()->channels * av_get_bytes_per_sample((enum AVSampleFormat)pcm->get()->format); auto len = pcm->get()->nb_samples * pcm->get()->channels * av_get_bytes_per_sample((enum AVSampleFormat)pcm->get()->format);
audio_player->playPCM((const char *) (pcm->get()->data[0]), MIN(len, frame->get()->linesize[0])); audio_player->playPCM((const char *)(pcm->get()->data[0]), MIN(len, frame->get()->linesize[0]));
});
audioTrack->addDelegate([decoder](const Frame::Ptr &frame) {
return decoder->inputFrame(frame, false, true);
}); });
audioTrack->addDelegate([decoder](const Frame::Ptr &frame) { return decoder->inputFrame(frame, false, true); });
} }
}); });
player->setOnShutdown([](const SockException &ex){ player->setOnShutdown([](const SockException &ex) { WarnL << "play shutdown: " << ex.what(); });
WarnL << "play shutdown: " << ex.what();
});
(*player)[Client::kRtpType] = atoi(argv[2]); (*player)[Client::kRtpType] = atoi(argv[2]);
//不等待track ready再回调播放成功事件这样可以加快秒开速度 // 不等待track ready再回调播放成功事件这样可以加快秒开速度
(*player)[Client::kWaitTrackReady] = false; (*player)[Client::kWaitTrackReady] = false;
if (argc > 3) { if (argc > 3) {
(*player)[Client::kPlayTrack] = atoi(argv[3]); (*player)[Client::kPlayTrack] = atoi(argv[3]);
} }
player->play(argv[1]); player->play(argv[1]);
SDLDisplayerHelper::Instance().runLoop(); SDLDisplayerHelper::Instance().runLoop();
}
sleep(1);
return 0; return 0;
} }