33 if (
pos != std::string::npos) {
40 audioInput_->setPaused(paused_);
46 demuxer_ = std::make_shared<MediaDemuxer>();
61MediaPlayer::configureMediaInputs()
68 size_t dot = path_.find_last_of(
'.');
69 std::string
ext =
dot == std::string::npos ?
"" : path_.substr(
dot + 1);
80 if (demuxer_->openInput(
devOpts) < 0) {
84 demuxer_->findStreamInfo();
88 lastPausedTime_ = startTime_;
93 audioInput_->configureFilePlayback(path_, demuxer_, audioStream_);
94 audioInput_->updateStartTime(startTime_);
97 }
catch (
const std::exception&
e) {
98 JAMI_ERROR(
"MediaPlayer {} open audio input failed: {}", path_,
e.what());
104 videoInput_->configureFilePlayback(path_, demuxer_, videoStream_);
107 }
catch (
const std::exception&
e) {
109 JAMI_ERROR(
"MediaPlayer {} open video input failed: {}", path_,
e.what());
113 demuxer_->setNeedFrameCb([
this]() ->
void { readBufferOverflow_ =
false; });
115 demuxer_->setFileFinishedCb([
this](
bool isAudio) ->
void {
117 audioStreamEnded_ =
true;
119 videoStreamEnded_ =
true;
126 fileDuration_ = demuxer_->getDuration();
127 if (fileDuration_ <= 0) {
139MediaPlayer::process()
143 if (fileDuration_ > 0 && streamsFinished()) {
144 audioStreamEnded_ =
false;
145 videoStreamEnded_ =
false;
146 playFileFromBeginning();
149 if (paused_ || readBufferOverflow_) {
154 const auto ret = demuxer_->demuxe();
166 readBufferOverflow_ =
true;
175MediaPlayer::emitInfo()
177 std::map<std::string, std::string> info {{
"duration", std::to_string(fileDuration_)},
178 {
"audio_stream", std::to_string(audioStream_)},
179 {
"video_stream", std::to_string(videoStream_)}};
186 return !path_.empty();
193 audioInput_->setMuted(
mute);
200 if (
pause == paused_) {
205 pauseInterval_ +=
av_gettime() - lastPausedTime_;
209 auto newTime = startTime_ + pauseInterval_;
211 audioInput_->setPaused(paused_);
212 audioInput_->updateStartTime(
newTime);
228 if (
time >= fileDuration_) {
229 playFileFromBeginning();
237 if (!demuxer_->seekFrame(-1,
time)) {
253 audioInput_->setSeekTime(
time);
254 audioInput_->updateStartTime(startTime_);
268MediaPlayer::playFileFromBeginning()
272 if (!demuxer_->seekFrame(-1, 0)) {
277 lastPausedTime_ = startTime_;
280 audioInput_->updateStartTime(startTime_);
292MediaPlayer::flushMediaBuffers()
301 audioInput_->flushBuffers();
315 return lastPausedTime_ - startTime_ - pauseInterval_;
317 return av_gettime() - startTime_ - pauseInterval_;
323 return fileDuration_;
333MediaPlayer::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.