36 if (
pos != std::string::npos) {
43 audioInput_->setPaused(paused_);
49 demuxer_ = std::make_shared<MediaDemuxer>();
64MediaPlayer::configureMediaInputs()
71 size_t dot = path_.find_last_of(
'.');
72 std::string
ext =
dot == std::string::npos ?
"" : path_.substr(
dot + 1);
83 if (demuxer_->openInput(
devOpts) < 0) {
87 demuxer_->findStreamInfo();
91 lastPausedTime_ = startTime_;
96 audioInput_->configureFilePlayback(path_, demuxer_, audioStream_);
97 audioInput_->updateStartTime(startTime_);
100 }
catch (
const std::exception&
e) {
101 JAMI_ERROR(
"MediaPlayer {} open audio input failed: {}", path_,
e.what());
107 videoInput_->configureFilePlayback(path_, demuxer_, videoStream_);
110 }
catch (
const std::exception&
e) {
112 JAMI_ERROR(
"MediaPlayer {} open video input failed: {}", path_,
e.what());
116 demuxer_->setNeedFrameCb([
this]() ->
void { readBufferOverflow_ =
false; });
118 demuxer_->setFileFinishedCb([
this](
bool isAudio) ->
void {
120 audioStreamEnded_ =
true;
122 videoStreamEnded_ =
true;
129 fileDuration_ = demuxer_->getDuration();
130 if (fileDuration_ <= 0) {
142MediaPlayer::process()
146 if (fileDuration_ > 0 && streamsFinished()) {
147 audioStreamEnded_ =
false;
148 videoStreamEnded_ =
false;
149 playFileFromBeginning();
152 if (paused_ || readBufferOverflow_) {
157 const auto ret = demuxer_->demuxe();
169 readBufferOverflow_ =
true;
178MediaPlayer::emitInfo()
180 std::map<std::string, std::string> info {{
"duration", std::to_string(fileDuration_)},
181 {
"audio_stream", std::to_string(audioStream_)},
182 {
"video_stream", std::to_string(videoStream_)}};
189 return !path_.empty();
196 audioInput_->setMuted(
mute);
203 if (
pause == paused_) {
208 pauseInterval_ +=
av_gettime() - lastPausedTime_;
212 auto newTime = startTime_ + pauseInterval_;
214 audioInput_->setPaused(paused_);
215 audioInput_->updateStartTime(
newTime);
231 if (
time >= fileDuration_) {
232 playFileFromBeginning();
235 if (!demuxer_->seekFrame(-1,
time)) {
249 audioInput_->setSeekTime(
time);
250 audioInput_->updateStartTime(startTime_);
261MediaPlayer::playFileFromBeginning()
265 if (!demuxer_->seekFrame(-1, 0)) {
270 lastPausedTime_ = startTime_;
273 audioInput_->updateStartTime(startTime_);
285MediaPlayer::flushMediaBuffers()
294 audioInput_->flushBuffers();
308 return lastPausedTime_ - startTime_ - pauseInterval_;
310 return av_gettime() - startTime_ - pauseInterval_;
316 return fileDuration_;
326MediaPlayer::streamsFinished()
#define JAMI_ERROR(formatstr,...)
#define JAMI_WARNING(formatstr,...)
static constexpr auto MS_PER_PACKET
void emitSignal(Args... args)
std::shared_ptr< AudioInput > getAudioInput(const std::string &device)
DeviceParams Parameters used by MediaDecoder and MediaEncoder to open a LibAV device/stream.