假设一种场景,正常播放一个mp4文件。整个调用原理是什么样的呢?
我觉得流程应该是这样:
第一部分:准备阶段
1,用户点击文件或视频后,player的线程将被创建,初始化一系列参数(callback...),创建pipleline,创建decodebin1然后转到ready状态,
2, 随即player转到pause状态,去激活并调用callback来选择demux,其实这个时候已经提前根据文件扩展名或者url特征来选择一种demuxer。pause还会激活active gstreamer本身的函数,然后调用ffmpeg 接口来open MP4文件尝试解析一帧或几帧,这样就获取并分离了mp4 file info的信息,如,audio /video decode信息等,为下一步做准备。callback在选择demuxer的时候将设置sink pad的propority.并且将element连接到decodebin1后.注意ffmpeg是在pause active的时候被启动。
3,step2我们获取了audio/video的数据,会创建新的pad用来接收audio/video stream的数据,此时数据仍是压缩状态。新的pad会连接在decodebin1后。此阶段创建element用于存放分析的stream数据。
4,分别创建audio /video的decodebin2,并切换到pause状态来选择(callback fun)并连接video /audio decoder到decodebin2后面.此时会调用ffmpeg interface获取omx的type。
5,同样,将video/audio omx连接到decodebin2后。
6,step5会继续分别将alsa和xvimagesinkelement 连接到decodebin2后。为play真正做准备。