Skip to content

媒体播放 ​

cpp
class MediaWidget : public Widget;
enum class MediaState { kIdle, kLoading, kPlaying, kPaused, kEnded, kError };

Flutter 式纹理共享:平台后端把视频帧解码成 OpenGL 纹理,渲染层再把它合成到 widget 矩形中。桌面端为 libmpv(MpvMediaPlayer),移动端为原生播放器。

需要 NEOFLUX_HAS_MPV

桌面 libmpv 后端仅在定义了 NEOFLUX_HAS_MPV 时编译。否则 CreateMediaPlayer() 返回 nullptr,MediaWidget 只显示占位。详见 媒体指南。

MediaWidget ​

头文件:<neoflux/widgets/media_widget.h>。

方法签名说明
SetSourceMediaWidget& SetSource(std::string_view)文件路径或 URL。(可链式)
GetSourcestd::string_view GetSource() const noexcept
Playvoid Play()开始/继续。
Pausevoid Pause()
Stopvoid Stop()复位到开头。
Seekvoid Seek(double seconds)
SetVolumeMediaWidget& SetVolume(double)0.0 静音,1.0 最大。(可链式)
GetVolumedouble GetVolume() const noexcept
GetPositiondouble GetPosition() const noexcept秒。
GetDurationdouble GetDuration() const noexcept秒;未知为 0。
GetStateMediaState GetState() const noexcept
GetPlayerMediaPlayer* GetPlayer() noexcept高级控制。
SetBackgroundColorMediaWidget& SetBackgroundColor(const Color&)占位背景。(可链式)
SetTextColorMediaWidget& SetTextColor(const Color&)占位文字。(可链式)

点击 widget 可切换播放/暂停。

cpp
auto media = std::make_shared<MediaWidget>();
media->SetSource("tests/data/sample.mp4")->SetVolume(0.8);
media->Play();
container->AddChild(media);

MediaPlayer(抽象) ​

头文件:<neoflux/media/media_player.h>。与平台后端解耦的接口。

cpp
class MediaPlayer {
 public:
  virtual void SetSource(std::string_view) = 0;
  virtual void Play() = 0;
  virtual void Pause() = 0;
  virtual void Stop() = 0;
  virtual void Seek(double seconds) = 0;
  virtual void SetVolume(double) = 0;
  virtual double GetPosition() const noexcept = 0;
  virtual double GetDuration() const noexcept = 0;
  virtual MediaState GetState() const noexcept = 0;
  virtual int GetVideoWidth() const noexcept = 0;
  virtual int GetVideoHeight() const noexcept = 0;
  virtual void SetStateCallback(StateCallback) = 0;   // void(MediaState)
  virtual void SetFrameCallback(FrameCallback) = 0;   // void(uint32_t tex, int w, int h)
  virtual void InitRender() = 0;                       // 渲染线程,GL 上下文当前
  virtual uint32_t UpdateTexture() = 0;                // 返回 GL 纹理名
};
std::unique_ptr<MediaPlayer> CreateMediaPlayer();

线程约束

InitRender() 与 UpdateTexture() 必须在渲染线程且 GL 上下文当前时调用。 业务代码只调用控制方法。

MpvMediaPlayer ​

cpp
class MpvMediaPlayer final : public MediaPlayer;

头文件:<neoflux/media/mpv_media_player.h>。桌面 libmpv render-API 实现。 采用 pimpl,头文件不暴露任何 mpv/GL 类型。请用 CreateMediaPlayer() 创建, 而非直接构造。

MediaState 取值 ​

取值含义
kIdle未加载源。
kLoading加载/缓冲中。
kPlaying播放中。
kPaused已暂停。
kEnded播放结束。
kError出错。

讨论

Released under the GPL-3.0 License.