整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

在H5场景中插入自定义音频和视频(任意画面)

在H5场景中插入自定义音频和视频(任意画面)

文由Zoomla!逐浪CMS官方发行,提升每一个开发者技能,并提供丰富的帮助信息。

在动力场景中,可以自由引用全场背景音乐。

但是,在一些特殊场合,比如要做一个音乐相册,如何自由定义相应音乐?

其实方法很简单,我们只要采用图文按钮,在“html”模式下粘贴代码就能自由上传、定义音乐:

首先我们选择左上角的添加新组件,

然后选择图文按钮,如下图:

在编辑器录入框中,输入相应代码:

插入视频的方法是:

<video width="300px" height="200px" style="border: 1px solid rgb(154, 199, 254); border-image: none;" src="
https://www.z01.com/The_Sea.mp4
" controls="" poster="
https://www.z01.com/skin/2010/images/mp3.jpg"></video
>

其效果如下:

插入音频的方法是:

<audio src="
https://www.z01.com/The_Sea.mp3
" controls="controls" autoplay />

其中autoplay是用于自动播放,如果放入此字符,则会自动播放,否则不会自动播放,如下图所示:

而controls是显示播放器按钮,如果不想显示播放器,则放入背景,不显示即可。

如果要插入优酷等第三方视频,则应使用通用代码,进行插入:

<iframe height=498 width=510 src='http://player.youku.com/embed/XNzEzNTkyMTAw' frameborder=0 'allowfullscreen'></iframe>

体验预览:http://v.z01.com/h5/1318

*需要注意的是,在HTML代码模式编辑好代码后,要再点此代码,回到可视化编辑,再保存,否则代码不会生效。

提案:https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p1967r10.html

通过预处理器嵌入资源,例如嵌入图片 #embed "art.png",嵌入当前代码 #embed __FILE__


代码示例

#include <string_view>
#include <iostream>

static constexpr char self[]={ 
  #embed __FILE__ 
};


int main()
{
    std::cout << std::string_view{std::cbegin(self), std::cend(self)} <<std::endl;
}


运行结果

ASM generation compiler returned: 0
Execution build compiler returned: 0
Program returned: 0
#include <string_view>
#include <iostream>

static constexpr char self[]={ 
  #embed __FILE__ 
};

int main()
{
    std::cout << std::string_view{std::cbegin(self), std::cend(self)} <<std::endl;
}

在线测试

https://godbolt.org/z/zEz3GP6qW

么是Embed Directive?

在Golang 1.16版本中,引入了一个新特性://go:embed。这个特性允许你在编译时将文件或目录直接嵌入到你的Go程序中。想象一下,你的静态文件、配置文件甚至图片都可以无缝地集成到你的二进制文件中,再也不需要担心文件丢失或者路径问题了!

嵌入单个文件

假设你有一个静态HTML文件,名为index.html。你可以使用//go:embed将它嵌入到你的Go代码中。

package main

import (
	_ "embed"
	"fmt"
)

//go:embed index.html
var indexHTML string

func main() {
	fmt.Println(indexHTML)
}

html的内容为:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>embed_sample.go</title>
</head>
<body>
    测试嵌入外部文件!
</body>
</html>

在上面的代码中,我们使用//go:embed将index.html文件的内容嵌入到indexHTML变量中。然后,你就可以在代码中随意使用这个变量了。运行代码,得到以下输出:

<!DOCTYPE html>                   
<html lang="en">                  
<head>                            
    <meta charset="UTF-8">        
    <title>embed_sample.go</title>
</head>                           
<body>                            
    测试嵌入外部文件!             
</body>                           
</html>  

嵌入多个文件

当然,有时候你可能需要嵌入多个文件。这也难不倒//go:embed!

//go:embed static/*.html
var staticFiles embed.FS	
data, _ :=staticFiles.ReadFile("static/page1.html")
	fmt.Println(string(data))


在这个例子中,我们使用通配符将static目录下的所有HTML文件嵌入到staticFiles变量中。然后,我们可以通过ReadFile方法读取这些文件。

嵌入目录

有时候,你可能想要嵌入整个目录,而不仅仅是文件。


// 嵌入目录
//go:embed static/*
var assets embed.FS

// 嵌入目录
	fs.WalkDir(assets, ".", func(path string, d fs.DirEntry, err error) error {
		if err !=nil {
			return err
		}
		fmt.Println(path)
		return nil
	})

在这个例子中,我们将static目录及其子目录中的所有文件嵌入到了assets变量中。然后,我们使用fs.WalkDir遍历并打印出所有嵌入的文件路径。

嵌入文本和二进制文件

//go:embed不仅可以嵌入文本文件,还可以嵌入二进制文件。

//go:embed logo.png
var logo []byte
	// 嵌入二进制数据
	fmt.Printf("Logo size: %d bytes\n", len(logo))


在这个例子中,我们将一个logo.png文件嵌入到了logo变量中。这个变量是一个字节切片,可以用来处理二进制数据。

go:embed的用法汇总

为了帮助大家更好地理解//go:embed的用法,下面我们用表格的形式来总结一下:

用法类型

示例代码

说明

单个文件

//go:embed index.html <br> var indexHTML string

将单个文件的内容嵌入到字符串变量中

多个文件

//go:embed static/*.html <br> var staticFiles embed.FS

使用通配符将多个文件嵌入到文件系统变量中

嵌入目录

//go:embed assets/* <br> var assets embed.FS

将整个目录及其子目录中的所有文件嵌入到文件系统变量中

二进制文件

//go:embed logo.png <br> var logo []byte

将二进制文件嵌入到字节切片中


使用场景

那么,//go:embed到底有哪些实际的使用场景呢?下面列出了一些常见的应用场景,供大家参考:

  1. 嵌入静态网站:将HTML、CSS、JavaScript文件嵌入到Go程序中,打造一个无需依赖外部文件的静态网站。
  2. 嵌入配置文件:将配置文件嵌入到程序中,确保配置的一致性和安全性。
  3. 嵌入图像和字体:将图像、字体等资源嵌入到程序中,避免路径问题和文件丢失。
  4. 嵌入SQL脚本:将数据库初始化脚本嵌入到程序中,方便数据库的自动化部署。

完整示例

package main

import (
	"embed"
	_ "embed"
	"fmt"
	"io/fs"
)

// 嵌入单个文件
//
//go:embed index.html
var indexHTML string

// 嵌入多个文件按
//
//go:embed static/*.html
var staticFiles embed.FS

// 嵌入目录
//
//go:embed static/*
var assets embed.FS

//go:embed logo.png
var logo []byte

func main() {
	fmt.Println(indexHTML)

	data, _ :=staticFiles.ReadFile("static/page1.html")
	fmt.Println(string(data))

	// 嵌入目录
	fs.WalkDir(assets, ".", func(path string, d fs.DirEntry, err error) error {
		if err !=nil {
			return err
		}
		fmt.Println(path)
		return nil
	})

	// 嵌入二进制数据
	fmt.Printf("Logo size: %d bytes\n", len(logo))
}

总结

好了,小伙伴们,我们今天的Golang Embed Directive之旅就到这里了。希望通过这篇文章,你能够对//go:embed有一个全面的了解,并能够在实际项目中灵活运用这个特性。

如果你觉得这篇文章对你有所帮助,别忘了点赞、评论和关注哦!你的支持是我们不断创作优质内容的动力!