什么场景下需要修改解码器的优先级?

如果是使用GStreamer低层element来构建pipeline(不使用高层接口),因为可以直接指定解码器,所以自然不需要去修改编解码器的默认优先级。
如下,使用gst-launch播放一个flac的音频,我们就直接指定了omxflacdec作为音频解码器:

gst-launch-1.0 filesrc location=/backup/1.flac ! flacparse ! omxflacdec ! alsasink

但是,当我们直接使用高层的playbin来进行媒体播放时,没有可操作的途径来选择解码器,只能通过调整默认的解码器优先级来实现选择。

gst-launch-1.0 playbin uri=file:///backup/1.flac audiosink=alsasink

GStreamer中关于Element的优先级的定义

GStreamer中demuxer,decoder,encoder类型的element都有自己的优先级,在注册时通过rank值指定。该值的基本类型定义在 gst/gstpluginfeature.h 中,如下:

/*** GstRank:* @GST_RANK_NONE: will be chosen last or not at all* @GST_RANK_MARGINAL: unlikely to be chosen* @GST_RANK_SECONDARY: likely to be chosen* @GST_RANK_PRIMARY: will be chosen first** Element priority ranks. Defines the order in which the autoplugger (or* similar rank-picking mechanisms, such as e.g. gst_element_make_from_uri())* will choose this element over an alternative one with the same function.** These constants serve as a rough guidance for defining the rank of a* #GstPluginFeature. Any value is valid, including values bigger than* @GST_RANK_PRIMARY.*/
typedef enum
{GST_RANK_NONE      = 0,GST_RANK_MARGINAL  = 64,GST_RANK_SECONDARY    = 128,GST_RANK_PRIMARY     = 256
} GstRank;

这些element的优先级,通过注册element时传入的rank值决定,注册element的API位于 gst/gstelementfactory.h中,如下:

gboolean gst_element_register(GstPlugin *plugin, const gchar *name, guint rank, GType type);

修改gst-libav和gst-omx中相关解码器的默认优先级

gst-libav和gst-omx分别包含了我们常用的软件解码和硬件解码的element。
gst-libav中音频解码器的注册逻辑位于ext/libav/gstavauddec.c中,如下:

gboolean
gst_ffmpegauddec_register (GstPlugin * plugin)
{.../* (Ronald) MPEG-4 gets a higher priority because it has been well-* tested and by far outperforms divxdec/xviddec - so we prefer it.* msmpeg4v3 same, as it outperforms divxdec for divx3 playback.* VC1/WMV3 are not working and thus unpreferred for now. */switch (in_plugin->id) {case AV_CODEC_ID_RA_144:case AV_CODEC_ID_RA_288:case AV_CODEC_ID_COOK:rank = GST_RANK_PRIMARY;break;/* SIPR: decoder should have a higher rank than realaudiodec.*/case AV_CODEC_ID_SIPR:rank = GST_RANK_SECONDARY;break;case AV_CODEC_ID_MP3:rank = GST_RANK_NONE;break;default:rank = GST_RANK_MARGINAL;break;}if (!gst_element_register (plugin, type_name, rank, type)) {g_warning ("Failed to register %s", type_name);g_free (type_name);return FALSE;}...}

可以看到gst-libav中音频解码器的默认优先级大部分为GST_RANK_MARGINAL。类似的视频解码器注册位于 ext/libav/gstavviddec.c中。可以修改该部分代码,按需求给特定的element定义rank值。

gst-omx属于wrapper plugins,每个硬件产商提供的代码可能会不同。目前我在telechips平台上做开发,其解码器的注册位于omx/gstomx.c中,和上面gst-libav略有不同,通过读取gstomx.conf这个配置文件中的信息来注册element(换汤不换药而已)。

static gboolean plugin_init(GstPlugin *plugin)
{...static const gchar *config_name[] = { "gstomx.conf", NULL };...elements = g_key_file_get_groups(config, &n_elements);for(i = 0; i < n_elements; i++){...gint rank;GST_DEBUG("Registering element '%s'", elements[i]);...rank = g_key_file_get_integer(config, elements[i], "rank", &err);...ret |= gst_element_register(plugin, elements[i], rank, subtype);}...
}

看一下gstomx.conf这个配置文件:

...[omxaacdec]
type-name=GstOMXAACDec
core-name=/nand1/tccgst/lib/libomxil-tcc.so.0
component-name=OMX.TCC.aacdec
rank=257
in-port-index=0
out-port-index=1
hacks=no-disable-outport;event-port-settings-changed-ndata-parameter-swap;no-empty-eos-buffer;[omxflacdec]
type-name=GstOMXFLACDec
core-name=/nand1/tccgst/lib/libomxil-tcc.so.0
component-name=OMX.TCC.flacdec
rank=257
in-port-index=0
out-port-index=1
hacks=no-disable-outport;event-port-settings-changed-ndata-parameter-swap;no-empty-eos-buffer;...

其中包含了每个element的rank值定义,可以看到硬件解码element的优先级默认都是很高的。所以,修改这个值就可以修改对应element的优先级了。

如何查看当前系统中各element的优先级

可以使用 gst-inspect 工具。 比如想查看一下当前flac相关的解码element有哪些:

root@telechips-tcc8971-lcn-2:# gst-inspect-1.0 | grep flac
libav:  avdec_flac: libav FLAC (Free Lossless Audio Codec) decoder
omx:  omxflacdec: Free Lossless audio decoder
audioparsers:  flacparse: FLAC audio parser
typefindfunctions: application/x-id3v2: mp3, mp2, mp1, mpga, ogg, flac, tta
typefindfunctions: application/x-id3v1: mp3, mp2, mp1, mpga, ogg, flac, tta
typefindfunctions: audio/x-flac: flac

可以看到有来自gst-libav plugin的avdec_flac以及来自gst-omx plugin的omxflacdec两个组件(element)
使用gst-inspect分别查看其优先级:

root@telechips-tcc8971-lcn-2:# gst-inspect-1.0 avdec_flac
Factory Details:Rank                     marginal (64)Long-name                libav FLAC (Free Lossless Audio Codec) decoderKlass                    Codec/Decoder/Audio...root@telechips-tcc8971-lcn-2:# gst-inspect-1.0 omxflacdec
Factory Details:Rank                     primary + 1 (257)Long-name                Free Lossless audio decoderKlass                    Codec/Decoder/Audio...

可以看到其rank分别为64和257。

GStreamer修改解码器默认优先级相关推荐

  1. 华为和思科设备路由协议默认优先级总结

    一.华为设备路由协议默认优先级 华为设备路由协议默认优先级 路由协议 路由协议外部优先级 路由协议内部优先级 直连  0 0 OSPF 10 10 ospf ASE 150 150 OSPF NSSA ...

  2. 华为vrrp默认优先级_华为VRRP综合配置

    实验一.VRRP主备备份的配置 vrrp简介 虚拟路由冗余协议VRRP(Virtual Router Redundancy Protocol)是通过把几台路由设备联合组成一台虚拟的路由设备,将虚拟路由 ...

  3. 双系统修改开机默认引导项

    方案一:bios修改默认启动windows 系统:win10 + centos7 主板:华硕w55xj 开机按esc,查看启动项顺序,发现这里第一个是centos(p0),第二个是windows(p1 ...

  4. linux命令优先级设置,linux renice命令参数及用法详解(linux修改程序运行优先级命令)...

    linux renice命令参数及用法详解(linux修改程序运行优先级命令) 发布时间:2012-07-21 12:45:32   作者:佚名   我要评论 renice指令可重新调整程序执行的优先 ...

  5. mysql5.7系列修改root默认密码

    mysql5.7系列修改root默认密码 操作系统为centos7 64 1.修改 /etc/my.cnf,在 [mysqld] 小节下添加一行:skip-grant-tables=1 这一行配置让 ...

  6. Linux 修改SSH 默认端口 22,防止被破解密码

    2019独角兽企业重金招聘Python工程师标准>>> Linux/Unix 系统,很多人使用SSH + 密码来登陆服务器,默认 22端口,这样会有被暴力破解密码的危险(除非密码足够 ...

  7. 修改docker默认网桥

    这里介绍两种修改docker默认网桥的方法,这两种方法都是通过修改daemon.json文件实现的. 第一种 1.删除旧网络 $ sudo service docker stop $ sudo ip ...

  8. Kali Linux修改桌面默认图标

    Kali Linux修改桌面默认图标 从Kali Linux 2019.4开始,支持Undercover模式,类似Windows模式.大学霸IT达人当用户切换为Undercover模式后,默认桌面图标 ...

  9. html5音轨字幕,(图解)如何修改mkv默认音轨和字幕

    平常有下载一些MKV双语电影在家里看,一般播放时电影默认播放外语加中文字幕,不过家里老爸老妈听不懂外语,所以每次看片时我还要手动切换音轨变成国语的.要是可以修改mkv的默认音轨或字幕就好了,于是我就找 ...

  10. linux怎么修改sftp默认端口,如何在 Linux 系统中如何更改 SFTP 端口

    SFTP(SSH文件传输协议)是一种安全文件协议,用于通过加密连接在两个主机之间传输文件. 它还允许您对远程文件执行各种文件操作并恢复文件传输. SFTP可以替代旧版FTP协议. 它具有FTP的所有功 ...

最新文章

  1. Android进阶笔记:Messenger源码详解
  2. 2021年技术人员的最佳Linux桌面前5名
  3. 【Flask】flask入门以及第一个flask项目的创建
  4. GlusterFS安装配置
  5. 信息学奥赛一本通(1215:迷宫)
  6. python存储json数据_python 存储json数据
  7. 分享Qt的面试题目(或许未来的我能用的上呢)
  8. ACM题目————中位数
  9. 数组的几种定义方式及初始化
  10. webgis之qgis缓存
  11. 基于QT4.8.3的手机操作系统,已完成QML语言的加入
  12. 电子计算机及其部件,2021年电子计算机及其部件行业营销部门表格模板汇总.docx...
  13. python手机代码编辑器_Pycharm(Python代码编辑器) V2020.1.2 官方版
  14. Struts1 页面提交到ActionForm,form为null
  15. Flux、Mono、Reactor 实战(史上最全)
  16. MATLAB绘图(一)
  17. [译]一个健壮且可扩展的 CSS 架构所需的 8 个简单规则
  18. 4G蓝牙信号(广播包)采集器
  19. STM32-MIDI音乐播放程序
  20. 红米联通版刷机包 MIUIV6 扁平化 精简 稳定 流畅 省电 长用版

热门文章

  1. 【考题·习题详解】数论知识+数学推导
  2. Hexo 搭建个人博客(九)NexT 主题进阶配置
  3. 在PS中,1PX等于多少毫米?
  4. 对偶传播神经网络(CPN)
  5. 看了那些 Google 大神 Jeff Dean 的传说后,我跪了!
  6. 《数据蜂巢架构演进之路》阅读笔记
  7. 集成 React Native 到现有Android项目
  8. 毕业设计——基于STM32的家庭健康监测系统
  9. creo 6.0—02:单位的设置,默认绘图模板的绘制(重点)
  10. 普渡大学统计与计算机科学,普渡大学西拉法叶分校