多媒体中心“ Kodi”和Yocto项目


Yocto项目简介


Yocto项目是一个协作的开源项目,旨在简化嵌入式系统发行版的开发。 Yocto包含大量模板,元数据和构建工具。 在Yocto Project中,您可以为各种硬件平台连接大量的BSP(平台支持包)层。

本文的主要目的是尝试以著名的多媒体中心Kodi(Raspberry Pi 3B单板计算机的版本17.6)为例,展示Yocto Project中典型分发包的组装。

如果您内心深处某个地方觉得自己是一个收藏家,但尚未决定要收藏什么,那么本文适合您。 如果您已经在日常工作中使用Yocto Project,则可以滚动阅读本文。 直接进入上一章并做好准备。

本文纯粹是实用的,并演示了使用Yocto Project和OpenEmbedded的成果来建立多媒体中心“ Kodi”的可能性。 Yocto图层是使用Google的Repo实用程序进行管理的。 本系列文档中的一篇文章。

所以:走吧。

内容:


在Ubuntu上安装 Yocto Project
Yocto项目中的发行版构建引擎
在Yocto项目中使用 OpenEmbedded
平台支持 (BSP)
使用回购管理 Yocto图层
安装仓库
发行版本清单
清单内容
清单说明
Bs清单结构
初始化 Poky变量
回购初始化
回购同步
创建 Yocto项目配置
配置文件build / conf / local.conf
配置文件build / conf / bblayers.conf
组装多媒体中心的
结构
配置
食谱的组成
食谱核心的组成
食谱内核的组成
成分食谱-媒体中心
食谱的组成 -多媒体
Kodi Build 食谱补遗
Kodi设置菜单添加新项目
视频的最大缓冲设置
通过IPTV 观看电视
使用Kodi插件观看Youtube
控制台外壳网络配置扩展
发行构建配方
创建分发映像的简要指南
后记

在Ubuntu上安装Yocto Project


要在Ubuntu上使用Yocto Project构建发行版,您需要安装以下软件包:

sudo apt-get install -y --no-install-suggests --no-install-recommends \ gawk wget git-core diffstat unzip texinfo gcc-multilib \ build-essential chrpath socat cpio python python3 python3-pip python3-pexpect \ xz-utils debianutils iputils-ping python3-git python3-jinja2 libegl1-mesa libsdl1.2-dev \ xterm 

使用apt-get install命令和特权升级命令sudo 安装软件包。 在Ubuntu系统中,当使用sudo命令执行管理操作时(这是创建系统的主要用户时,它会自动注册在“ sudo”组中),这是一种普遍的做法。

您可以在此处查看更详细的安装说明

Yocto项目中的发行版构建引擎


在Yocto项目中,每个程序单元都是使用汇编配方来描述的。 配方描述语言类似于“ bash”,能够以python语言插入代码段。 您可以从Yocto Project手册中获取基本语法信息。 根据目的,可以将一组组装配方组合到单独的组装层中。

层分为与硬件相关的层-BSP层,UI层(用户界面),特定的Yocto层以及实现某些功能的层:
例如,来自OpenEmbedded =>多媒体,python,perl,ruby,网络,systemd,网络服务器等的图层。

在Yocto项目中使用OpenEmbedded


但是,如果您使用Yocto Project,则可以肯定的是,您将需要具有附加功能的图层,即 适用于所有场合的大量食谱。 有这么一套-这些是OpenEmbedded的食谱。 OpenEmbedded是用于构建嵌入式Linux软件包的基础结构。

OpenEmbedded与Yocto项目完全兼容,因为该项目是Yocto项目的基础。 也许这就是为什么Yocto Project的稳定性更好,文档更好,支持更好的原因(但基本上它仍然是相同的OpenEmbedded)。

平台支持包(BSP)


板级支持包是特定板的单独的专用层,用于定义平台的硬件功能,即 实现那些使一块板与另一块板区分开的特定事物:处理器功能,中断,寻址,引导加载程序功能,视频适配器(GPU)功能等。

本文使用BSP层-meta-raspberrypi
图层存储库位于: git.yoctoproject.org/git/meta-raspberrypi

使用回购管理Yocto图层


Yocto Project可以使用来自不同供应商(设备开发人员)的大量层,所有这些都需要以某种方式进行管理。 想象一下,您有十几个不同的电路板,每个电路板都带有一个单独的BSP git存储库,并且这不包括Yocto项目本身的基础结构以及OpenEmbedded可能提供的其他功能。

在这种情况下,您将不会获得单独的简单安装脚本。 Willy-nilly,必须寻找能够做到这一点的工具。 甚至超过了好。 此类最佳工具之一是Google实用工具-Repo。

在使用大型代码库构建Android操作系统时, Repo是用于管理GIT存储库的主要工具。 Repo允许您在一个项目中管理十几个(如果不是一百个)单独的git存储库,您可以在宣言的一个xml文件中仔细指定其版本

为了正确同步所有存储库的所有版本,您只需要运行一个命令

回购同步

安装仓库


使用以下命令集,可以将Repo安装到〜/ bin主目录中
(curl命令可以单独安装:sudo apt-get install curl)

 PATH=${PATH}:~/bin mkdir ~/bin curl http://commondatastorage.googleapis.com/git-repo-downloads/repo > ~/bin/repo chmod a+x ~/bin/repo 


将来您只需要在控制台中使用以下命令: repo

大概
如果HOME / bin目录未自动添加标准启动路径
参见文件HOME / .profile

$
$ PATH = $ {PATH}:〜/ bin
$回购
$

发行版本清单


在文章框架中收集的发行版,我需要称呼它。 命名为Torvin 。 代号为Torvin,它将包含一个Linux发行版和一个程序的汇编。 这指的是一个应用程序用户程序-Kodi,仅此而已(其他所有内容都是系统级的)。 对于多媒体中心,我认为这已经足够了。

清单内容


torvin-0.2.5.xml文件用于管理分发层

  <?xml version="1.0" encoding="UTF-8"?> <manifest> <default sync-j="4" revision="rocko"/> <remote fetch="https://git.yoctoproject.org/git" name="yocto"/> <remote fetch="https://github.com/openembedded" name="oe"/> <remote fetch="https://github.com/berserktv" name="bs"/> <project remote="bs" revision="master" name="bs-manifest" path="sources/bs-manifest"> <linkfile dest="setup-environment" src="setup-environment"/> <linkfile dest="shell.sh" src="raspberry/shell.sh"/> <linkfile dest="sources/base" src="raspberry/rocko"/> </project> <project remote="yocto" revision="rocko" name="poky" path="sources/poky"/> <project remote="oe" revision="rocko" name="meta-openembedded" \ path="sources/meta-openembedded"/> <project remote="yocto" revision="rocko" name="meta-raspberrypi" \ path="sources/meta-raspberrypi"/> <project remote="bs" revision="rocko" name="berserk" path="sources/berserk"/> </manifest> 

清单说明


在清单的开头, 远程标记表示两个主要的GIT存储库和一个辅助的:

https:⁄⁄git.yoctoproject.org / git -Yocto存储库名为yocto
https:⁄⁄github.com / openembedded-名为oe的 OpenEmbedded存储库
https:⁄⁄github.com / berserktv-名为bs的辅助GIT存储库

在清单的下一部分,使用缩写命名,我们处理位于这些存储库中的项目project标签包含以下属性:

remote-远程命名存储库的名称
版本 -分支或哈希版本的名称
name-指定存储库中的项目名称
path-文件系统中的本地项目路径

    <project remote="bs" revision="master" name="bs-manifest" path="sources/bs-manifest"> </project>  xml      : git clone https://github.com/berserktv/bs-manifest -b master sources/bs-manifest 

项目标签的主体中,我指示了一些命令,这些命令用于创建指向需要Poky构建系统的初始初始化和正常启动的辅助脚本的基础结构的符号链接。

    linkfile <project remote="bs" revision="master" name="bs-manifest" path="sources/bs-manifest"> <linkfile dest="setup-environment" src="setup-environment"> <linkfile dest="shell.sh" src="raspberry/shell.sh"> <linkfile dest="sources/base" src="raspberry/rocko"> </project>        : ln -s src dest .. #      ln -s sources/bs-manifest/setup-environment setup-environment ln -s sources/bs-manifest/raspberry/shell.sh shell.sh #    ,  #      cd sources ln -s bs-manifest/raspberry/rocko base 

Bs清单结构


 ├──复制
 ├──覆盆子
 │├──摇滚
 ││├──conf
 │││├──bblayers.conf
 │││└──local.conf
 ││└──torvin-0.2.5.xml
 │└──shell.sh
 ├──README.md
 └──设置环境


bs-manifest项目用于灵活的配置管理,同时考虑了发行版不同版本的程序集。 我有这个版本-0.2.5

初始化Poky变量


初始化脚本的设置环境来自Freescale Community项目(在yocto环境中,这是一个常见的解决方案)。 该脚本负责初始化Poky构建系统的变量,该脚本创建一个目录结构,该目录结构在其中进行了很好的划分:

  • 建立 - 建立目录
  • 源代码 -汇编配方源代码
  • download-用于下载程序代码的目录(git数据库,tar.gz存档)

可以在此处查看安装环境脚本的内容

Shell.sh脚本内容
  #!/bin/bash MACHINE='raspberrypi3' source ./setup-environment build echo "you may try 'bitbake core-image-minimal'" bash 


该根脚本用于初始化构建环境的配置变量,通常在会话开始时调用。

回购初始化


要初始化仓库,您必须运行以下命令:

 mkdir torvin cd torvin repo init -u https:⁄⁄github.com/berserktv/bs-manifest -m raspberry/rocko/torvin-0.2.5.xml 

-u https:⁄⁄github.com / berserktv / bs-manifest告诉GIT清单项目的路径

注意:您也可以指定-b tree_name
(如果未指定-b开关,则假定使用master分支(默认情况下))

配置文件的路径-m raspberry / rocko / torvin-0.2.5.xml表示以下内容:

  1. 要为其执行装配的硬件平台的名称- 树莓派
  2. Yocto / OpenEmbedded工作分支的主要名称是rocko
  3. 该版本的代号为torvin (0.2.x系列的所有版本)
  4. 正在组装的数字版本号是0.2.5

回购同步


要引导或后续同步,只需运行以下命令:

 repo sync 

它将获取清单文件中指定的GIT项目的所有最新版本(通常会显示分支),如果您在version属性中具有哈希提交或标记名称,则此git信息库的版本不会更改。 标签名称可以这样指定:版本=“ refs /标签/ v0.2.5”

创建Yocto项目配置


执行repo sync命令后,您可以开始创建Yocto Project的主要配置:

 ./shell.sh 

脚本完成后,将创建build / conf目录:
有两个主要文件:

  • local.conf-程序集控制变量:
    平台名称,分发类型和构建软件包等。
  • bblayers.conf -Yocto项目的连接层的配置

默认情况下,setup-environment脚本查找source / base / conf
初始配置以及local.confbblayers.conf文件
存在,将它们复制到build / conf
(请参阅setup-environment中的TEMPLATES变量)

即 文件取自/ bs-manifest / raspberry / rocko / conf
看到创建一个符号链接到基础

配置文件build / conf / local.conf


显示/隐藏
  MACHINE ??= 'raspberrypi3' DISTRO ?= 'poky' PACKAGE_CLASSES ?= "package_deb" EXTRA_IMAGE_FEATURES ?= "debug-tweaks" USER_CLASSES ?= "buildstats image-mklibs image-prelink" PATCHRESOLVE = "noop" BB_DISKMON_DIRS = "\ STOPTASKS,${TMPDIR},1G,100K \ STOPTASKS,${DL_DIR},1G,100K \ STOPTASKS,${SSTATE_DIR},1G,100K \ STOPTASKS,/tmp,100M,100K \ ABORT,${TMPDIR},100M,1K \ ABORT,${DL_DIR},100M,1K \ ABORT,${SSTATE_DIR},100M,1K \ ABORT,/tmp,10M,1K" PACKAGECONFIG_append_pn-qemu-native = " sdl" PACKAGECONFIG_append_pn-nativesdk-qemu = " sdl" CONF_VERSION = "1" DL_DIR ?= "${BSPDIR}/downloads/" # size memory GPU for Raspberry Pi GPU_MEM = "128" GPU_MEM_256 = "112" GPU_MEM_512 = "160" GPU_MEM_1024 = "320" # for libs: "mpeg2dec libmad ffmpeg x264" LICENSE_FLAGS_WHITELIST += "commercial" 


配置文件build / conf / bblayers.conf


显示/隐藏
  # POKY_BBLAYERS_CONF_VERSION is increased each time build/conf/bblayers.conf # changes incompatibly LCONF_VERSION = "6" POKY_BBLAYERS_CONF_VERSION = "2" BBPATH = "${TOPDIR}" BSPDIR := \ "${@os.path.abspath(os.path.dirname(d.getVar('FILE', True)) + '/../..')}" BBFILES ?= "" BBLAYERS ?= " \ ${BSPDIR}/sources/poky/meta \ ${BSPDIR}/sources/poky/meta-poky \ ${BSPDIR}/sources/poky/meta-yocto-bsp \ ${BSPDIR}/sources/meta-openembedded/meta-oe \ ${BSPDIR}/sources/meta-openembedded/meta-python \ ${BSPDIR}/sources/meta-openembedded/meta-networking \ ${BSPDIR}/sources/meta-openembedded/meta-multimedia \ ${BSPDIR}/sources/meta-openembedded/meta-filesystems \ ${BSPDIR}/sources/meta-raspberrypi \ ${BSPDIR}/sources/berserk/meta-berserk \ " 



local.conf文件的主要变量-您需要注意:

  • MACHINE-进行组装的平台的名称
  • DISTRO-发行类别名称
  • PACKAGE_CLASSES-安装软件的软件包格式
  • LICENSE_FLAGS_WHITELIST-使用其他许可证

Raspberry Pi系列主板的特定设置

  • GPU_MEM =“ 128”-GPU视频适配器的视频内存量(从RAM分配)
  • GPU_MEM_256 =“ 112”-仅对于总RAM大小为256MB的主板相同
  • GPU_MEM_512 =“ 160”-仅对于总RAM = 512MB的主板相同
  • GPU_MEM_1024 =“ 320”-相同,仅适用于RAM总大小= 1024MB的主板

注意:
例如,如果仅保留变量GPU_MEM =“ 128”,
然后对于所有RPI,RPI2,RPI3板
不管实际RAM的数量如何
板上的显卡将始终分配给GPU-128Mb
(并且总RAM大小减少此值)

如果指定了所有变量,则指令GPU_MEM_256,GPU_MEM_512,GPU_MEM_1024的优先级更高。

有关常规中心Yocto层的多媒体中心组装,请参阅bblayers.conf文件。

 ${BSPDIR}/sources/poky/meta \ ${BSPDIR}/sources/poky/meta-poky \ ${BSPDIR}/sources/poky/meta-yocto-bsp \ 

我将四个层与OpenEmbedded的附加功能连接在一起。

Kodi Multimedia Center-是一个复杂的程序,使用大量外部库,您需要使用构建配方来构建每个库,因此,如果可能,我将使用“ 多媒体”类别中来自OpenEmbedded的所有配方

因此,我连接了一个多媒体层及其所依赖的层

 ${BSPDIR}/sources/meta-openembedded/meta-oe \ ${BSPDIR}/sources/meta-openembedded/meta-python \ ${BSPDIR}/sources/meta-openembedded/meta-networking \ ${BSPDIR}/sources/meta-openembedded/meta-multimedia \ 

然后连接另一个OpenEmbedded层以使用文件系统

 ${BSPDIR}/sources/meta-openembedded/meta-filesystems \ 

进一步连接了Raspberry Pi平台的主要BSP层

 ${BSPDIR}/sources/meta-raspberrypi \ 

好吧,最后,连接了一个附加层,该附加层负责使用“多媒体中心”的功能来组装分发映像。

 ${BSPDIR}/sources/berserk/meta-berserk \ 

组装多媒体中心的层


在我看来,Yocto项目是用于创建嵌入式发行版的工业组合。 但是,如果您曾经使用过Buildroot构建系统,那么Yocto可能对您来说很麻烦。 它使用大量的可用硬盘空间。 对于正常运行,Yocto需要大约80-100 GB的可用空间,这通常只考虑了针对一个平台的组装。

Yocto满足其主要目的-支持尽可能多的不同硬件平台,这需要用于切换组件的最灵活的机制。 这种机制需要时间和地点。 在Yocto中建立发行版本不是一个快速的过程。

因此,我在单独的层中具有用于组装“多媒体中心”的所有功能:

 https://github/berserktv/berserk 

(摘自我最喜欢的书,《哈默与十字架》,哈里·哈里森(Harry Harrison)。)
(托尔文也是这本书中的角色。)

为了实现我需要的功能,我将使用所谓的食谱附加组件,这些附加组件位于扩展名为.bbappend的文件中
在.bbappend文件中,您可以将自己的命令调用添加到常规构建配方方法中,例如,添加到do_configure,do_compile,do_install方法等中。

层结构


 ├──复制
 ├──元狂
 │├──conf
 ││└──layer.conf
 │├──菜式
 ││├──bs-net
 ││├──首轮
 ││├──图片
 ││└──电视
 │├──菜芯
 ││├──init-ifupdown
 ││└──psplash
 │├──食谱内核
 ││└──Linux
 │├──食谱-媒体中心
 ││├──科迪
 ││└──kodi插件
 │└──多媒体食谱
 │└──ffmpeg
 ├──README.md
 └──changelog.txt


层组成:

  • conf-层配置
  • recipes-berserk-分发构建配方,电视,网络和首次启动配方
  • 食谱核心 -基本食谱,特别是对启动食谱的修改
  • recipes-kernel -Linux内核构建配方
  • recipes-mediacentre-构建Kodi及其插件的食谱
  • 多媒体食谱-多媒体食谱,ffmpeg汇编

层配置


包含layer.conf文件
  # We have a conf and classes directory, add to BBPATH BBPATH .= ":${LAYERDIR}" # We have a packages directory, add to BBFILES BBFILES += "${LAYERDIR}/recipes-*/*/*.bb \ ${LAYERDIR}/recipes-*/*/*.bbappend" BBFILE_COLLECTIONS += "bs" BBFILE_PATTERN_bs := "^${LAYERDIR}/" BBFILE_PRIORITY_bs = "5" DISTRO_FEATURES_append += " wifi x11" PREFERRED_VERSION_ffmpeg = "3.1.11" SYSVINIT_ENABLED_GETTYS = "1" PREFERRED_VERSION_linux-raspberrypi ?= "4.9%" 


该文件包含ffmpeg库的版本,Linux内核的版本号以及虚拟控制台(tty)的指示,并包含分发工具包的功能-wifi x11
DISTRO_FEATURES_append + =“ wifi x11”

PREFERRED_VERSION_ffmpeg =“ 3.1.11”
SYSVINIT_ENABLED_GETTYS =“ 1”

PREFERRED_VERSION_linux-raspberrypi?=“ 4.9%”

食谱的组成


 ├──bs网
 │└──bs-net_0.1.3.bb
 ├──首轮
 │├──档案
 ││└──first-run.sh
 │└──first-run.bb
 ├──图片
 │└──berserk-image.bb
 └──电视
     ├──文件
     │└──berserk.m3u8
     ├──tv-config.bb
     └──tv-dir.inc


其中:

  • bs-net_0.1.3.bb-构建WLAN /以太网接口外壳扩展的方法
  • first-run.bb-首次运行的配方,其他磁盘分区
  • first-run.sh-第一次运行的外壳脚本(在运行级别S上运行)
  • berserk-image.bb-建立分布图的方法
  • tv-config.bb-使用IPTV配置电视频道的方法
  • berserk.m3u8-公共电视频道的配置(m3u8格式)

食谱核心组成


 ├──init-ifupdown
 │├──档案
 ││└──接口
 │└──init-ifupdown_1.0.bbappend
 └──psplash
     ├──文件
     │└──psplash-berserk-img.h
     └──psplash_git.bbappend


其中:

  • interfaces-具有当前网络设置的文件
  • init-ifupdown_1.0.bbappend-网络配置配方的扩展
  • psplash-berserk-img.h-启动屏幕保护程序的图像
    使用gdk-pixbuf-csource实用程序获得的头文件
  • psplash_git.bbappend-用于启动启动屏幕保护程序的配方的扩展

目标设备上的网络配置在文件中:

 /etc/network/interfaces 

添加了配方init-ifupdown的扩展名后,我用自己的配置文件替换了常规配置文件,并更改了针对执行级别运行的脚本的顺序(优先级)

 INITSCRIPT_PARAMS = "start 98 2 3 4 5 . stop 10 0 6 1 ." 

目前,几乎所有现代Linux发行版都包含启动屏幕。 通常,启动屏幕保护程序会显示下载的当前状态,即 自系统启动以来经过的时间指示器。 在这方面,Yocto也不例外,您可以将标准启动屏幕保护程序的图像更改为任意图片。

为此,您必须:

  1. FILESEXTRAPATHS_prepend-添加资源目录
  2. SRC_URI-添加带有任意图片的头文件
  3. SPLASH_IMAGES-更改程序包控制变量

在图像配方“ berserk-image.bb”中,还需要添加启动启动图像作为图像的特征

 IMAGE_FEATURES += "splash" #          SPLASH = "psplash-berserk" 

食谱内核的组成


 └──Linux
     ├──文件
     │├──db.txt.patch
     │└──rbpi.cfg
     └──linux-raspberrypi_4.9.bbappend


其中:

  • db.txt.patch-带有管理域基础的补丁(用于WiFi)
  • rbpi.cfg-Linux内核配置片段
  • linux-raspberrypi_4.9.bbappend-Raspberry Pi 4.9内核构建配方的扩展

Wi-Fi设备以特定的频率运行,因此对于它们来说,存在监管范围之类的东西-这是表明该设备应在哪个国家/地区工作的参数。

Linux内核有一个配套数据库,其中为每个国家/地区注册了允许的频率和允许的功率。

在最简单的情况下,可以通过指定一个参数将该数据库静态地直接直接包含在内核中:
CONFIG_CFG80211_INTERNAL_REGDB = y
正是我通过将补丁程序与此db.txt.patch数据库连接而完成的操作

还有一件事:Yocto中存在诸如内核配置片段之类的东西。 通常,配置片段(带有cfg扩展名的文件)仅包含您出于某些特定目的明确需要的内核参数。 并将此配置添加到构建内核时配方中已经存在的默认参数中。

除了bbappend配方外,您还可以更改启动期间传递给内核的参数:

即 覆盖变量
CMDLINE参见文件linux- raspberrypi_4.9.bbappend

rbpi.cfg内容
  # use statically compiled regulatory rules database CONFIG_CFG80211_INTERNAL_REGDB=y #  Wifi  Asus USB-N53 chipset Ralink RT3572 CONFIG_RT2800USB=m #  wifi    Atheros D-Link DWA-126 802.11n (AR9271), # NetGear WNDA3200, NetGear WNA1100, TP-Link TL-WN722N (AR9271), # TL-WN322G v3, TL-WN422G  .. . cateee.net CONFIG_ATH9K_HW=m CONFIG_ATH9K_HTC=m #  Wifi    wpa_supplicant CONFIG_WIRELESS=y CONFIG_WEXT_CORE=y CONFIG_WEXT_PROC=y CONFIG_CRYPTO_AES=y #    IPSec,    Wifi  #   wpa_supplicant   CONFIG_CRYPTO_CCM=m CONFIG_CRYPTO_CTR=m CONFIG_CRYPTO_ARC4=m ######################### #   CONFIG_HAVE_PERF_EVENTS=y CONFIG_PERF_EVENTS=y CONFIG_HAVE_LATENCYTOP_SUPPORT=y CONFIG_LATENCYTOP=y # This option adds support for ASIX AX88xxx # based USB 2.0 10/100 Ethernet adapters. CONFIG_USB_NET_AX8817X=m 


linux-raspberrypi_4.9.bbappend
  #      rpbi.cfg FILESEXTRAPATHS_prepend := "${THISDIR}/files:" SRC_URI += "file://db.txt.patch;patch=1 \ file://rbpi.cfg \ " #  BSP  meta-raspberrypi     # https://github.com/agherzan/meta-raspberrypi/issues/14 #    #   do_kernel_configme   #     arch/    do_kernel_configme_append() { cat ${WORKDIR}/rbpi.cfg >> ${WORKDIR}/defconfig } # CMDLINE for raspberrypi # default CMDLINE = "dwc_otg.lpm_enable=0 console=serial0,115200 # root=/dev/mmcblk0p2 rootfstype=ext4 rootwait" CMDLINE = "quiet dwc_otg.lpm_enable=0 console=serial0,115200 \ root=/dev/mmcblk0p2 rootfstype=ext4 rootwait" 


recipes-mediacentre


 ├── kodi │  ├── kodi │  ├── kodi_17.bbappend │  ├── kodi-dir.inc │  ├── kodi-runner.bb │  ├── kodi-settings.bb │  └── kodi-version.inc └── kodi-plugins ├── files ├── kodi-language-ru_3.0.10.bb ├── kodi-pvr-iptvsimple.bb ├── plugin-video-youtube_5.5.1.bb ├── screensaver-kodi-universe_0.1.2.bb ├── script-berserk-network_0.2.5.bb └── script-module-requests_2.12.4.bb 

其中:

  1. kodi/
    • kodi — icon,run,settings
    • kodi_17.bbappend — Kodi
    • kodi-dir.inc — Kodi
    • kodi-runner.bb — Kodi
    • kodi-settings.bb — Kodi
    • kodi-version.inc — Kodi

  2. kodi-plugins/

    • files — tar.gz
    • kodi-language-ru_3.0.10.bb — ( Kodi)
    • kodi-pvr-iptvsimple.bb — Kodi pvr-iptvsimple
    • plugin-video-youtube_5.5.1.bb — Kodi «Youtube»
    • screensaver-kodi-universe_0.1.2.bb — screensaver-kodi-universe
    • script-berserk-network_0.2.5.bb —
    • script-module-requests_2.12.4.bb — Youtube


recipes-multimedia


└── ffmpeg
    ├── ffmpeg
    │  ├── 0001-ffmpeg-Call-get_format-to-fix-an-issue-with-MMAL-ren.patch
    │  ├── h264_parser.patch
    │  └── pfcd_hevc_optimisations.patch
    └── ffmpeg_3.1.11.bb


其中:

  • 0001-ffmpeg-Call-get_format-to-fix-an-issue-with-MMAL-ren.patch — ffmpeg
  • h264_parser.patch — h264
  • pfcd_hevc_optimisations.patch — Raspberry Pi
  • ffmpeg_3.1.11.bb — ffmpeg (, )

FFmpeg -OpenSource库,用于编码/解码大量视频和音频格式。FFmpeg支持近400种编解码器(ffmpeg -codecs)
和300多种格式(ffmpeg -formats)。

Kodi Build Recipe Addition


OpenEmbedded层包含一个用于构建Kodi的常规方法,但这很笼统,我想为Raspberry Pi平台获得一个稍微更稳定和经过测试的版本。

软件开发人员具有反向端口修补程序之类的东西。该软件会不断更新,每个新版本均包含新功能和已知错误的更正。反向移植修补程序允许您将程序的新版本中的某些更改转移到较旧的版本,从而使其更稳定。但这是一项非常艰巨而艰苦的工作,始终由大量开发人员执行。

在开源社区中,有几个使用Kodi的知名项目,其中最好的(我认为)是LibreElec(OpenElec)。LibreElec在Raspberry Pi平台上拥有良好的构建。在这里,他们拥有了,最好是为Kodi准备反向端口修补程序。因此,您甚至无需学习就可以摆脱大量问题。

Kodi多媒体中心专注于播放“媒体”环境,我认为最关键的组成部分是Kodi和FFmpeg的结合,即 在这些程序某些版本的交互作用下,Yocto和OpenEmbedded层可以保留其他库。

为了进行组装,我选择了稳定的Kodi 17.6版本和FFmpeg 3.1.11版本。

注意事项:
   ,       ,      systemD.         (   (  )).  ,     LibreElec       : #!/bin/bash HASH_VER="934507d922fb011ce46c76566206f2f1f603360b" git clone https://github.com/LibreELEC/LibreELEC.tv.git libreelec cd libreelec git checkout ${HASH_VER}   Kodi,   : projects/RPi2/patches/kodi (. : kodi-001-backport.patch)    FFmpeg,   : packages/multimedia/ffmpeg/patches 


随附的版本描述文件将是这样的kodi-version.inc

 FILESEXTRAPATHS_prepend := "${THISDIR}/kodi:" #  Krypton SRCREV = "a9a7a20071bfd759e72e7053cee92e6f5cfb5e48" PV = "17.6+gitr${SRCPV}" 

我正在考虑的Yocto和OpenEmbedded分支-rocko包含Kodi版本17.3,并且为了升级到版本17.6,只需在配方中添加一小部分内容-kodi_17.bbappend

 require kodi-version.inc #     (   17.3) SRC_URI_remove = "file://0013-FTPParse.cpp-use-std-string.patch" #  ,   systemd   SRC_URI_remove = "file://0004-handle-SIGTERM.patch" #      RPI   libreelec SRC_URI_append += "file://kodi-krypton-rpb-backports.patch" #  error adding symbols: DSO missing from command line SRC_URI_append += "file://vchostif.patch" MENU_ICON = "addons/skin.estuary/media/icons/settings" #       ( ) SRC_URI_append += "file://bs-menu.patch file://icon/bs-network.png" do_configure_prepend() { install -m 0644 ${WORKDIR}/icon/bs-network.png ${S}/${MENU_ICON} } #    kodi plugins RRECOMMENDS_${PN}_append = "\ python-xml python-misc python-db \ python-crypt python-threading python-math python-email \ python-io python-netserver python-urllib3 python-datetime" #     Raspberry Pi #  OPENGL    --enable-gles #  kodi     docs/README.linux => libxmu libxinerama # libxtst xdpyinfo #      DISTRO_FEATURES   "x11" #   kodi  RPI1  RPI2,3    --disable-x11 BS_RPI = " --disable-gl --enable-openmax --enable-player=omxplayer \ --with-platform=raspberry-pi --disable-x11" BS_RPI3 = " --disable-gl --enable-openmax --enable-player=omxplayer \ --with-platform=raspberry-pi2 --disable-x11" EXTRA_OECONF_append = "${@bb.utils.contains('MACHINE', 'raspberrypi', \ '${BS_RPI}', '', d)}" EXTRA_OECONF_append = "${@bb.utils.contains('MACHINE', 'raspberrypi2', \ '${BS_RPI3}', '', d)}" EXTRA_OECONF_append = "${@bb.utils.contains('MACHINE', 'raspberrypi3', \ '${BS_RPI3}', '', d)}" #       Kodi   #  ,  USB  microSDHC  ( ) EXTRA_OECONF_append = " --enable-optical-drive" 

构建选项“ --enable-optical-drive”使您可以连接Kodi在连接光盘时使用的便捷通知机制。在这种情况下,MediaManager模块(a)(xbmc / storage / MediaManager.cpp)监视新磁盘分区的连接/断开连接,并显示有关它的弹出消息。

udev连接/断开驱动器的示例:

 ACTION=="add" SUBSYSTEM=="block" ENV{ID_FS_TYPE}=="vfat" \ KERNEL=="sd[az][0-9]" \ RUN+="/bin/mkdir -p /media/%k", \ RUN+="/bin/mount -o iocharset=utf8,noatime /dev/%k /media/%k" ACTION=="add" SUBSYSTEM=="block" ENV{ID_FS_TYPE}=="ntfs" \ KERNEL=="sd[az][0-9]" \ RUN+="/bin/mkdir -p /media/%k", \ RUN+="/usr/bin/ntfs-3g -o \ iocharset=utf8,noatime,windows_names /dev/%k /media/%k" ACTION=="add" SUBSYSTEM=="block" ENV{ID_FS_TYPE}=="ext2|ext3|ext4" \ KERNEL=="sd[az][0-9]" \ RUN+="/bin/mkdir -p /media/%k", \ RUN+="/bin/mount -o noatime /dev/%k /media/%k" ACTION=="remove" SUBSYSTEM=="block" KERNEL=="sd[az][0-9]" \ RUN+="/bin/umount /media/%k", RUN+="/bin/rmdir /media/%k" 

 :  rmdir     ,       ( Linux    -  )       . 

向Kodi设置菜单添加新项目


在Kodi 17.6中,xml配置文件负责显示菜单项。要在“设置”菜单下添加更多项目,只需调整文件:
kodi / addons / skin.estuary / xml / Settings.xml

,其中skin.estuary是默认菜单设计主题,项目

说明如下所示:

<项目>
    <label> $ LOCALIZE [13279] </ label>
    <onclick> RunAddon(script.berserk.network,但网络)</ onclick>
    <icon>图标/设置/ bs-network.png </ icon>
</ item>


其中:

label
onclick
( , «butnetwork»)
icon — ( png )

, Kodi bs-menu.patch

/
  diff -Naur a/addons/skin.estuary/xml/Settings.xml b/addons/skin.estuary/xml/Settings.xml --- a/addons/skin.estuary/xml/Settings.xml 2018-02-01 18:17:45.000000000 +0300 +++ b/addons/skin.estuary/xml/Settings.xml 2018-03-08 12:06:50.000000000 +0300 @@ -134,6 +134,11 @@ <icon>icons/settings/interface.png</icon> </item> <item> + <label>$LOCALIZE[13279]</label> + <onclick>RunAddon(script.berserk.network,butnetwork)</onclick> + <icon>icons/settings/bs-network.png</icon> + </item> + <item> <label>$LOCALIZE[20077]</label> <onclick>ActivateWindow(SkinSettings)</onclick> <icon>icons/settings/skin.png</icon> diff -Naur a/system/addon-manifest.xml b/system/addon-manifest.xml --- a/system/addon-manifest.xml 2018-03-07 15:58:24.000000000 +0300 +++ b/system/addon-manifest.xml 2018-05-14 14:06:58.000000000 +0300 @@ -27,6 +27,7 @@ <addon>resource.uisounds.kodi</addon> <addon>screensaver.xbmc.builtin.black</addon> <addon>screensaver.xbmc.builtin.dim</addon> + <addon>screensaver.kodi.universe</addon> <addon>script.module.pil</addon> <addon>service.xbmc.versioncheck</addon> <addon>skin.estuary</addon> @@ -43,4 +44,8 @@ <addon>xbmc.python</addon> <addon>xbmc.webinterface</addon> <addon optional="true">peripheral.joystick</addon> + <addon>script.berserk.network</addon> + <addon>resource.language.ru_ru</addon> + <addon>script.module.requests</addon> + <addon>plugin.video.youtube</addon> </addons> 



Kodi :

 <advancedsettings> <cache> <buffermode>1</buffermode> <memorysize>139460608</memorysize> <readfactor>20</readfactor> </cache> </advancedsettings> 

buffermode = 1-
所有文件系统(包括本地)

读因子的 缓冲区请求
-根据平均视频比特率调整下载速度。因此,例如,如果您播放的视频的平均数据传输速率为5 Mbit / s,并将缓冲区读取比率设置为2.0,则会将下载速度(以及缓存填充率)限制为大约10 Mbit / s,因此:

readfactor = 20
消除了对下载速度

memorysize = 139460608 的限制
-缓冲区大小为133 MB,而使用133 * 3 RAM,即 大约400 MB的RAM

通过IPTV观看电视


Kodi Media Center是用于查看数字内容的非常强大的工具。

我收集的“媒体中心”的主要功能是使用IPTV(互联网协议电视)观看数字电视的功能,即互联网协议上的电视。使用此功能,您可以从互联网提供商处观看数字电视。

无论是在图像质量还是在附加功能方面,这都是最现代,最理想的选择。提供的服务。例如,可以在档案库中提供电视频道,其中在广播之后的某个时间可以使用所需的视频记录。

为了在Kodi中支持IPTV,有几个插件选项,其中我选择了插件pvr.iptvsimple

要构建插件,请使用以下配方:

    └──kodi插件
        └──kodi-pvr-iptvsimple.bb


该插件是通过以下方式连接/配置的:
Kodi主菜单=>“附加组件” =>“我的附加组件” =>“ PVR客户端” =>“ PVR IPTV简单客户端”

为了检查IPTV电视作为Kodi的一部分的运行方式,我采用了一些公共新闻频道并将它们以m3u8格式添加到列表中,并且还在媒体中心开始处打开了插件“ pvr.iptvsimple”的自动启动功能。

使用Kodi插件观看Youtube


开发Kodi的程序员提供了扩展其功能的灵活性。这样做是为了使任何发烧友(如果需要)可以向Kodi添加他真正需要的东西。这些Kodi插件是黑暗的。好吧,你明白了。它们太多了,因此值得在另一篇文章中进行描述。

插件的安装非常简单,只需将Kodi连接到互联网,然后按菜单中的几个按钮即可。您可以在任何有关Kodi的论坛上阅读有关它的信息。但是程序集,就是程序集,我将在分发工具包中包含一个插件作为示例。

在我看来,Kodi最有趣和广泛使用的插件(ohm)是Youtube视图插件。 Kodi是一个多媒体中心,而Youtube是此类非常丰富的多媒体内容的最大存储库,因此Kodi的Youtube插件几乎是强制性的。

该插件是用python编写的,这是一种常规的插件机制,您无需编译任何东西,只需将完成的插件复制到带有插件的根目录中,然后在xml清单文件中指定插件名称:
“ System / addon-manifest.xml”

该插件取自官方存储库,其源代码包含在存档中:
recipes-mediacentre / kodi-plugins / files / plugin.video.youtube.tar.gz有关

插件构建食谱位置,请参见上文“食谱-媒体中心组成”一章

控制台外壳网络配置扩展


由于在本文框架内组装的分发套件是一个演示,因此对其设置“网络接口”的要求最低。我不想为此而拖累任何繁重的网络管理器,这对我来说是很不容易理解的,而且非常笨重,因此我编写了两个补充常规配置机制配置的Shell脚本:

 ############################################################## #     /etc/network/interfaces: ############################################################## auto eth0 iface eth0 inet manual up /etc/network/eth-manual $IFACE up down /etc/network/eth-manual $IFACE down auto wlan0 iface wlan0 inet manual up /etc/network/wlan $IFACE up down /etc/network/wlan $IFACE down 

为了通过GUI方便地配置以太网/ WLAN网络接口,我使用了另一个小的Kodi插件“ script.berserk.network”。这几乎是我发现的唯一Kodi插件,但为此我不得不编写它。它非常紧凑和简约,并以python语言编写。

这两个组件都是使用配方收集的:

  • 菜谱-Berserk / bs-net / bs-net_0.1.3.bb
  • 食谱-媒体中心/ kodi-插件/脚本-berserk-network_0.2.5.bb

在这一点上,我想详细介绍一下。因此,使用Yocto的所有灵活性都在于不同的食谱集,即 连接一组配方-将最简单的网络管理器添加到分发工具箱中,连接另一组-使用例如systemD等添加您喜欢的网络管理器。

为了在系统启动时自动连接到WiFi接入点,我使用udev规则:/etc/udev/rules.d/80-wifi-start.rules

 SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", KERNEL=="wlan*", \ RUN+="/etc/network/wlan-runner $env{INTERFACE} up" SUBSYSTEM=="net", ACTION=="remove", DRIVERS=="?*", KERNEL=="wlan*", \ RUN+="/etc/network/wlan-runner $env{INTERFACE} down" 

wlan-runner脚本只需执行以下命令:
/ etc / network / wlan $ IFACE up

/ etc / network / wlan $ IFACE下来

发行构建配方


Yocto项目具有重用机制。您可以从中继承类(指令“继承”),也可以连接一些基本配方(指令“ include”)。

我将使用类示例显示继承:
poky / meta / clasess / core-image.bbclass

该类负责描述可以包含在特定配方中的软件包组。为此,只需在菜谱的开头指示结构即可:
继承核心图像

即使在此类的文本中,您也可以看到图像的功能,每个功能负责图像中包含的一组功能,每个组最终描述了一组已安装的程序或库。

该图像的特征如下所示:

 IMAGE_FEATURES += "ssh-server-dropbear splash" 

还有DISTRO_FEATURES-可以在层配置文件中指定的分发功能。这些是分发级别的功能,例如,如果您更改某些功能(例如x11),则随后的程序集将开始重新组装所有依赖此选项的程序包(这可能需要很长时间)。

我使用的基本基本配方是:
poky / meta /食谱核心/图像/ core-image-minimal.bb

图像制作配方
  # Project: "Berserk" - build Kodi for the Raspberry Pi platform # license - The MIT License (MIT) DESCRIPTION = "Berserk - the image for the Raspberry PI" LICENSE = "MIT" MD5_SUM = "md5=0835ade698e0bcf8506ecda2f7b4f302" LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;${MD5_SUM}" IMAGE_FEATURES += "ssh-server-dropbear splash" #    rootfs    (250000kB=~250Mb) IMAGE_ROOTFS_EXTRA_SPACE_append += "+ 250000" # Base this image on core-image-minimal include recipes-core/images/core-image-minimal.bb # Set default password for 'root' user inherit extrausers ROOTUSERNAME = "root" ROOTPASSWORD = "berserk" EXTRA_USERS_PARAMS = "usermod -P ${ROOTPASSWORD} ${ROOTUSERNAME};" #  ,      SPLASH = "psplash-berserk" BS_DEBUG_TOOLS = "ldd strace ltrace" BS_GLIBC = "glibc-thread-db \ glibc-gconv-utf-16 \ glibc-gconv-utf-32 \ glibc-binary-localedata-en-us \ glibc-binary-localedata-ru-ru \ glibc-charmap-utf-8 \ " BS_BASE = "kernel-modules \ lsb \ pciutils \ parted \ tzdata \ dosfstools \ ntp \ ntpdate \ e2fsprogs-resize2fs \ ntfs-3g \ ntfsprogs \ " BS_WLAN = "kernel-module-rt2800usb \ kernel-module-rt2800lib \ kernel-module-rt2x00lib \ kernel-module-rt2x00usb \ kernel-module-cfg80211 \ kernel-module-nls-utf8 \ kernel-module-ath9k-common \ kernel-module-ath9k-hw \ kernel-module-ath9k-htc \ kernel-module-ctr \ kernel-module-ccm \ kernel-module-arc4 \ " BS_WIFI_SUPPORT = " \ iw \ dhcp-client \ wireless-tools \ wpa-supplicant \ linux-firmware \ " BS_SOFT = "mc \ kodi \ kodi-runner \ kodi-settings \ kodi-language-ru \ kodi-pvr-iptvsimple \ bs-net \ tv-config \ first-run \ script-berserk-network \ screensaver-kodi-universe \ plugin-video-youtube \ script-module-requests \ " # Include modules in rootfs IMAGE_INSTALL += " \ ${BS_BASE} \ ${BS_WLAN} \ ${BS_WIFI_SUPPORT} \ ${BS_GLIBC} \ ${BS_SOFT} \ ${BS_DEBUG_TOOLS} \ " 



我想澄清一下,例如,kernel-modules软件包会将
defconfig文件中指定的所有内核模块安装到分发映像中。

但是,如果您强烈地自定义某些内容,则当然甚至不需要所有的内核模块,在这种情况下,按名称添加每个模块很方便,如BS_WLAN变量所示,就像备忘单一样,仅指定需要的内容并在检查软件包后删除,检查“内核模块”等

创建分发映像的简要指南


1)在Ubuntu中安装Yocto Project依赖项:
  sudo apt-get install -y --no-install-suggests --no-install-recommends \ gawk wget git-core diffstat unzip texinfo gcc-multilib build-essential \ chrpath socat cpio python python3 python3-pip python3-pexpect \ xz-utils debianutils iputils-ping python3-git python3-jinja2 \ libegl1-mesa libsdl1.2-dev xterm 


2)下载并安装Repo:
  mkdir ~/bin curl http://commondatastorage.googleapis.com/git-repo-downloads/repo > ~/bin/repo chmod a+x ~/bin/repo 


3)从github下载项目:
  PATH=${PATH}:~/bin mkdir torvin cd torvin repo init -u https://github.com/berserktv/bs-manifest \ -m raspberry/rocko/torvin-0.2.5.xml repo sync 


4)构建项目:
  ./shell.sh bitbake berserk-image 


5)将分发映像写入存储卡:

torvin/build/tmp/deploy/images/raspberrypi3


:
berserk-image-raspberrypi3.rpi-sdimg

c
c UTC

dd

:
«microSDHC»
.

$ sudo bash
$ cd torvin/build/tmp/deploy/images/raspberrypi3
$ dd if=berserk-image-raspberrypi3.rpi-sdimg of=/dev/sdX bs=1M
$ sync

/dev/sdX:
X a,b,c ..


:
Windows,
Win32 Disk Imager :
:


注意事项:
              N      ,      ""          ,    git  (..         "")   :  - Intel(R) Core(TM) i5-3570 CPU @ 3.40GHz  - 8    -  USB-3.0 1T   - 4  05    - 1     - 274.8 M   torvin/build    (cache ,   ,   ,  ,   ,    ..) -   42    torvin/downloads -  9.1  (git    tar.gz )  rootfs   - 550     /lib/firmware - 212  /lib/modules - 53  :        firmware (   )       ,   200  


后记


近年来,OpenSource的功能只是在增加。

但是这些机会并不小,例如,您甚至不必走太远。同一位“微软”不太可能期望开源技术将其从移动操作系统市场上抛弃。我指的是来自Google的操作系统-“ Android”,该操作系统在一夜之间就抛弃了移动系统的“先锋”。目前尚不清楚微软是否能够再次回到它。

当然,“ Google”是一家拥有几乎无限的资金和优秀的开发人员的大型公司,但正如他们所说的那样,“没有Core而不是没有地方”。

随着时间的推移,最佳的开源项目成为一件艺术品(例如Kodi,Openelec / libre等)

今天,任何人都可以加入OpenSource的最佳实践,可以这么说,而无需离开Github(a)。本文是关于它的。

有许多适合您的好程序集,请记住“物联网的世界即将到来”。

Source: https://habr.com/ru/post/zh-CN467443/


All Articles