从视频中提取音频数据,然后应用傅里叶对音频降噪(python)

2023-11-04

视频准备
QQ有热键

然后随便打开一个视频网站进行录屏
我选择B站

从视频中提取音频

需要安装包moviepy

pip install moviepy

提取代码

from moviepy.editor import *
video = VideoFileClip('C:\\Users\\Shineion\\Desktop\\新建文件夹\\录屏.mp4')
audio = video.audio
audio.write_audiofile('C:\\Users\\Shineion\\Desktop\\新建文件夹\\录屏.wav')

结果:

音视频文献:
我都还未看(等以后真正涉及音视频时再看)
https://zulko.github.io/moviepy/
MoviePy - 中文文档
https://pypi.org/project/moviepy/

音频绘图

音频知识储备
音频采样率:
采样率与频率之间的关系,采样率越低,高频信息越少。CD的发行最低标准
是44.1kHz的采样率。采样率就是采样频率,采样频率是指录音设备在一秒钟内对声音信号的采样次数,采样频率越高声音的还原就越真实越自然。采样频率越高声音的还原就越真实越自然。
采样信号
是指模拟信号先由采样器按照一定时间间隔采样获得时间上的离散的值。

方法1 使用librosa提取音频,然后绘图
安装包

pip install librosa

音频绘图

import librosa
import numpy as np
import matplotlib.pyplot as plt
from pylab import *
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False


audio, freq = librosa.load('C:\\Users\\Shineion\\Desktop\\新建文件夹\\录屏.wav')#audio 采样信号,freq采样率
time = np.arange(0, len(audio)) / freq


plt.plot(time, audio)
plt.show()

方法2 使用scipy.io.wavfile提取音频,然后绘图

import numpy as np
import matplotlib.pyplot as plt
from pylab import *
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False
import scipy.io.wavfile as wf

#读取音频文件,将其按照采样率离散化,返回采样率和信号
#sample_reate:采样率(每秒采样个数), sigs:每个采样位移值。
#================1.原始音频信号,时域信息=================================
sameple_rate,sigs = wf.read('C:\\Users\\Shineion\\Desktop\\新建文件夹\\录屏.wav')
print('采样率:{}'.format(sameple_rate))
print('信号点数量:{}'.format(sigs.size))
print('采样信号',sigs)

times = np.arange(len(sigs))/sameple_rate#时间=信号点数量/采样频率
plt.figure('Filter',facecolor='lightgray')
plt.title('时间域',fontsize=16)
plt.ylabel('信号',fontsize=12)
plt.grid(linestyle=':')
plt.plot(times,sigs,color='dodgerblue',label='Noised Signal')
plt.legend()
plt.show()

采样信号有两列:第一列直流分量,第二例非直流

数据太多,只看前100个的数据
plt.plot(times[:100],sigs[:100],color=‘dodgerblue’,label=‘Noised Signal’)

应用傅里叶对音频进行降噪

算法知识储备
假设有一时间域函数:y = f(x),根据傅里叶理论它可以被分解为一系列正弦函数的叠加,这些正弦函数具有不同的振幅A,频率ω或初相位φ。:

在信息处理过程中,通常处理步骤是:

1.通过傅里叶变换是将时域(即时间域)上的信号转变为频域(即频率域)上的信号,进行相应的滤波去噪、增强、统计分析等处理。
2.处理后的信号可以通过傅里叶逆变换在转换成时域信号,从而达到相应的信号处理效果。

频率域的概念
频率域是指从函数的频率角度出发分析函数,和频率域相对的是时间域。简单说就是如果从时间域分析信号时,时间是横坐标,振幅是纵坐标。而在频率域分析的时候则是频率是横坐标,振幅是纵坐标。
举个例子,我们认为音乐是一个随着时间变化的震动。但是如果站在频域的角度上来讲,音乐是一个随着频率变化的震动,这样我们站在时间域的角度去观察你会发现音乐是静止的。同理,如果我们站在时间域的角度观察频率域的世界,就会发现世界是静止的,也是永恒的。这是因为在频率域是没有时间的概念的,那么也就没有了随着时间变化着的世界了。
另外,我们需要借助傅立叶变换,才能够在得到函数在频率域中的信息。

傅里叶变换
回顾一下傅里叶变换吧,没弄清傅里叶变换为什么能得到信号各个频率成分的同学也可以再借我的图理解下。
傅里叶变换把无限长的三角函数作为基函数:

这个基函数会伸缩,平移(其实是两个正交基的分解)。缩得窄,对应高频;伸得宽,对应低频。然后这个基函数不断和信号做相乘。某一个尺度(宽窄)下乘出来的结果,就可以理解成信号所包含的当前尺度对应频率成分有多少。于是,基函数会在某些尺度下,与信号相乘得到一个很大的值,因为此时二者有一种重合关系。那么我们就知道信号包含该频率的成分的多少。

看,这两种尺度能乘出一个大的值(相关度高),所以信号包含较多的这两个频率成分,在频谱上这两个频率会出现两个峰。
当然这是傅里叶变换,傅里叶变换我们需要对数据进行处理,然后逆傅里叶变换才能得到我们想要的。

第一步:读取数据

import numpy as np
import matplotlib.pyplot as plt
from pylab import *
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False
import scipy.io.wavfile as wf

#读取音频文件,将其按照采样率离散化,返回采样率和信号
#sample_reate:采样率(每秒采样个数), sigs:每个采样位移值。
#================1.原始音频信号,时域信息=================================
sameple_rate,sigs = wf.read('C:\\Users\\Shineion\\Desktop\\新建文件夹\\录屏.wav')

times = np.arange(len(sigs))/sameple_rate#时间=信号点数量/采样频率

第二步:绘制降噪前的频率振幅谱

ft_y=np.fft.fft(sigs)
print('ft_y',ft_y)
n = len(sigs)

#取得最大的振幅的二分之一
avg=np.max(abs(ft_y[1:]))/2
print('avg',avg)
plt.title("降噪前的频率振幅谱")
plt.plot(abs(ft_y))
plt.show()

ft_y 两列:第一列直流分量,第二例非直流

第三步:干掉小于最大振幅二分之一的信号
可以自己设置要干掉多少信号,不一定要是二分之一,直流是否要看自己

#ft_y[0]=0+0j#是否干掉直流
ft_y[np.where(abs(ft_y)<=avg)]=0+0j

逆傅里叶变换重新得到音频

plt.plot(abs(ft_y))
plt.title("降噪后的频率振幅谱")
plt.xlabel("频率")
plt.ylabel("amplitude")
plt.title("降噪后的音频")
plt.plot(np.fft.ifft(ft_y))

plt.show()
data=np.fft.ifft(ft_y)
data = data.astype('i2')#格式转换
wf.write('降噪.wav',sameple_rate,data)#保存

后面声音没啦,因为原始音频本来就很好,再处理会更糟糕。
该方法在时间-振幅 上 进行降噪
我觉得不是很好。
或者可能原始数据非周期性,所以效果不好。
该方法好像在周期性音频数据上也可以。
具体是什么原因,有空你自己去研究。

对噪声数据进行处理

因为前文的例子是非周期性,是在时间-振幅 上 进行降噪
这里给出一个周期性的数据来进行讨论,并在频域-振幅上进行降噪。

音频数据。
链接:https://pan.baidu.com/s/1PLIR3ug3neLcSpJZS1gc-Q
提取码:2vxr

第一步:读取数据

import numpy as np
import numpy.fft as nf
import matplotlib.pyplot as plt
from pylab import *
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False

import scipy.io.wavfile as wf

#读取音频文件,将其按照采样率离散化,返回采样率和信号
#sample_reate:采样率(每秒采样个数), sigs:每个采样位移值。
#原始音频信号,时域信息
sameple_rate,sigs = wf.read('C:\\Users\\Shineion\\Desktop\\新建文件夹\\noised.wav')
print('采样率:{}'.format(sameple_rate))
print('信号点数量:{}'.format(sigs.size))

times = np.arange(len(sigs))/sameple_rate
plt.figure('Filter',facecolor='lightgray')

plt.title('时间域',fontsize=16)
plt.ylabel('信号',fontsize=12)
plt.grid(linestyle=':')
plt.plot(times[:200],sigs[:200],color='dodgerblue',label='噪声信号 ')#查看前200个
plt.legend()
plt.show()

第二步:绘制频域图

fftfreq的说明:
在画频谱图的时候,要给出横坐标的数字频率,这里可以用fftfreq给出,对于fftfreq的说明如下:
scipy.fftpack.fftfreq(n, d=1.0)
第一个参数n是FFT的点数,一般取FFT之后的数据的长度(size)
第二个参数d是采样周期,其倒数就是采样频率Fs,即d=1/Fs

#基于傅里叶变换,获取音频频域信息
#绘制音频频域的: 频域/能量图像
freqs = nf.fftfreq(sigs.size, 1/sameple_rate)
complex_arry = nf.fft(sigs)
pows = np.abs(complex_arry)#取绝对值

plt.title('频率域',fontsize=16)
plt.ylabel('能量',fontsize=12)
plt.grid(linestyle=':')
plt.semilogy(freqs,pows,color='green',label='噪声 Freq')
plt.legend()
plt.show()

第三步:去噪

fun_freq = freqs[pows.argmax()] #获取频率域中能量最高的#1000.0
print('fun_freq',fun_freq)
noised_idx = np.where(freqs != fun_freq)[0] #获取所有噪声的下标
print('noised_idx',noised_idx)
ca = complex_arry[:]#complex_arry为前面傅里叶变换得到的数组
ca[noised_idx] = 0 #高通滤波#将噪声全部设为0
filter_pows = np.abs(complex_arry)#过滤后的傅里叶变换数据,原始数据已被修改,用于化

filter_sigs = nf.ifft(ca)#逆傅里叶变换

plt.title('时域图',fontsize=16)
plt.ylabel('Signal',fontsize=12)
plt.grid(linestyle=':')
plt.plot(times[:200],filter_sigs[:200],color='red',label='降噪后的信号')
plt.legend()
plt.show()

第四步:绘制降噪后的频域能量图

plt.title('频率域',fontsize=16)
plt.ylabel('power',fontsize=12)
plt.grid(linestyle=':')
plt.plot(freqs,filter_pows,color='green',label='降噪后的频谱能量图')#filter_pows为降噪后的数据,尚未进行逆傅里叶变换
plt.legend()
plt.show()

第五步:保存

filter_sigs = filter_sigs.astype('i2')#格式转换
wf.write('C:\\Users\\Shineion\\Desktop\\新建文件夹\\降噪.wav',sameple_rate,filter_sigs)

代码总结

说明 本文是只保留最高的频率,可以修改下面代码保留不同信息。

fun_freq = freqs[pows.argmax()] #获取频率域中能量最高的#1000.0
print(‘fun_freq’,fun_freq)
noised_idx = np.where(freqs != fun_freq)[0] #获取所有噪声的下标
print(‘noised_idx’,noised_idx)

如可以找到最大的几个高频索引,然后保留。
下面为寻找最大几个值索引的方法

import heapq

nums = [1, 8, 2, 23, 7, -4, 18, 23, 24, 37, 2]

# 最大的3个数的索引
max_num_index_list = map(nums.index, heapq.nlargest(3, nums))

# 最小的3个数的索引
min_num_index_list = map(nums.index, heapq.nsmallest(3, nums))

print(list(max_num_index_list))
print(list(min_num_index_list))

总结思路:傅里叶变换,然后绘制频域振幅图,找到高频分量的频率,过滤掉低频,最后逆傅里叶变换。
对于非周期性的数据,有待考量。比较我也没接触过。

参考文献
毕竟第一次接触音频,不知道音频是哈,所以参考啦一下,
感谢大佬,感谢大佬,感谢大佬。
参考他人,让我彻底的感受啦下其中的魅力和门道。
估计就叫这篇博文为学习笔记吧。

文献1:https://blog.csdn.net/a1040193597/article/details/99598173

文献2:https://blog.csdn.net/u014554395/article/details/100922534

算法总结
通过此文
我个人认为傅里叶只能处理偏周期性的,
如果是非周期性信号,可以采用短时傅里叶变换,即将信号分解成很多段,每段分别做傅里叶变换。但有那个功夫,还不如选择小波变换。

也可以应用小波变换进行降噪
代码可以参考我另一篇博文
小波降噪与重构例子 python

等我后面真正涉足音频时再学习其他方法吧。

在这里插入图片描述
电气工程的计算机萌新:余登武。
写博文不容易,如果你觉得本文对你有用,请点个赞支持下,谢谢。

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从视频中提取音频数据,然后应用傅里叶对音频降噪(python) 的相关文章

  • 动态向类添加类方法

    我有以下片段 FEED TYPES fan mail Fan Mail review Review tip Tip fan user Fan User fan song Fan Song fan album Fan Album played
  • 将 JSON 发布到 Python CGI

    我已经安装了 Apache2 并且 Python 可以工作 但我有一个问题 我有两页 一个是 Python 页面 另一个是带有 JQuery 的 Html 页面 有人可以告诉我如何让我的 ajax 帖子正常工作吗
  • 键入的完整命令行

    我想获得输入时的完整命令行 This join sys argv 在这里不起作用 删除双引号 另外 我不想重新加入已解析和拆分的内容 有任何想法吗 你太迟了 当键入的命令到达 Python 时 您的 shell 已经发挥了它的魔力 例如 引
  • django 模板 - 如何动态访问变量?

    假设我有一个具有以下上下文的 django 模板 data1 this is data1 data2 this is data2 data name data2 现在我知道了data name 假设它是 data2 是否可以用它来访问变量d
  • Python - Unicode 到 ASCII 的转换

    我无法在不丢失数据的情况下将以下 Unicode 转换为 ASCII u ABRA xc3O JOS xc9 I tried encode and decode他们不会这么做 有人有建议吗 Unicode 字符u xce0 and u xc
  • 为什么 re.findall 在查找字符串中的三元组项时不具体。 Python

    所以我有四行代码 seq ATGGAAGTTGGATGAAAGTGGAGGTAAAGAGAAGACGTTTGA OR 0 re findall r ATG 9 TAA TAG TGA seq 首先让我解释一下我正在尝试做什么 如果这令人困惑
  • 在请求中设置端口

    我正在尝试利用cgminer使用 Python 的 API 我对利用requests图书馆 我了解如何做基本的事情requests but cgminer想要更具体一点 我想缩小 import socket import json sock
  • 通过 Python 循环浏览网络上的目录并显示其内容(文件和其他目录)

    同样的道理在Python中处理从源目录到目标目录的一组文件 https stackoverflow com questions 2593399 process a set of files from a source directory t
  • Python-验证我的文档 xls 中是否存在工作表

    我正在尝试在空闲时间设计一个小程序 加载 xls 文件 然后在要扫描的文档中选择一张纸 步骤1 用户导入 xls文件 导入程序后检查文件是否存在 我能做到的 第 2 步 我要求用户提供要分析的文档表 xls 的名称 这就是它停止的地方 该程
  • Python 属性和 Swig

    我正在尝试使用 swig 为一些 C 代码创建 python 绑定 我似乎遇到了一个问题 试图从我拥有的一些访问器函数创建 python 属性 方法如下 class Player public void entity Entity enti
  • Seaborn 中没有线性拟合的散点图

    我想知道是否有办法关闭seaborn中的线性拟合lmplot或者是否有一个等效函数可以生成散点图 当然 我也可以使用 matplotlib 但是 我发现 seaborn 中的语法和美学非常吸引人 例如 我想绘制以下情节 import sea
  • 从迭代器外部将 StopIteration 发送到 for 循环

    有几种方法可以打破一些嵌套循环 他们是 1 使用中断 继续 for x in xrange 10 for y in xrange 10 print x y if x y gt 50 break else continue only exec
  • Python 2.7 缩进错误[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 这个问题是由拼写错误或无法再重现的问题引起的 虽然类似的问题可能是on topic help on topic在这里 这个问题的解决方式不
  • 如何创建用于霍夫曼编码和解码的树?

    对于我的作业 我将对霍夫曼树进行编码和解码 我在创建树时遇到问题 并且陷入困境 不要介意打印语句 它们只是让我测试并查看函数运行时的输出是什么 对于第一个 for 循环 我从主块中用于测试的文本文件中获取了所有值和索引 在第二个 for 循
  • Python 读取未格式化的直接访问 Fortran 90 给出不正确的输出

    这是数据的写入方式 它是一个二维浮点矩阵 我不确定大小 open unit 51 file rmsd nn output form unformatted access direct status replace recl Npoints
  • 没有名为“turtle”的模块

    我正在学习并尝试用Python3制作贪吃蛇游戏 我正在进口海龟 我正在使用 Linux mint 19 PyCharm python37 python3 tk Traceback most recent call last File hom
  • 两种 ODE 求解器之间的差异

    我想知道 两者之间有什么区别ODEINT and solve ivp用于求解微分方程 它们之间有什么优点和缺点 f1 solve ivp f 0 1 y0 y0 is the initial point f2 odeint f y0 0 1
  • 如何使用 Python/Django 在 Facebook 中获取(和使用)扩展权限

    我正在尝试编写一个简单的应用程序 让用户授予我的代码写入其页面的 Facebook 流的权限 据我了解 它应该很简单 让用户单击一个按钮 启动一个弹出窗口 其中包含我的 Facebook 应用程序中的页面 在该页面中 他们单击授予的内容流发
  • MoviePY 无法在 Windows 上检测 ImageMagick 二进制文件

    我刚买了一台新笔记本电脑 想要设置MoviePY在那新的Windows 64x Python3 7 0 机器 我对所有内容都进行了三次检查 但是当涉及到我的代码的文本部分时 它向我抛出了这个错误 OSError MoviePy Error
  • Biopython 可以执行 Seq.find() 来解释歧义代码吗

    我希望能够在 Seq 对象中搜索考虑歧义代码的子序列 Seq 对象 例如 以下内容应该是正确的 from Bio Seq import Seq from Bio Alphabet IUPAC import IUPACAmbiguousDNA

随机推荐

  • Android获取assets子目录注意事项

    获取assets子目录方法 span style font size 14px String subList getAssets list subdir span 返回当前目录下的所有文件 夹名 但不包含当前目录下子目录的文件 夹名 如果需
  • react源码中的hooks

    今天 让我们一起深入探究 React Hook 的实现方法 以便更好的理解它 但是 它的各种神奇特性的不足是 一旦出现问题 调试非常困难 这是由于它的背后是由复杂的堆栈追踪 stack trace 支持的 因此 通过深入学习 React 的
  • nacos的使用(借鉴淘宝Diamond配置中心)

    nacos常见的使用方法无非就是将获取到的配置文件放入propertise文件中 再从propertise中获取内容 如果配置过多 每增加一个nacos配置就得加一个propertise文件 文件多了 不便于维护 像一些需要经常改动的配置
  • softmax(二):softmax交叉熵不是真正的目标函数

    最近一直在消化 吸收大神的输出 在这里主要把思路捋顺 试着增加自己的理解和扩展 首先 上链接 还有我的膝盖 拜王峰大神 可以直接看大神的文字 从最优化的角度看待Softmax损失函数 Softmax理解之Smooth程度控制 一 优化的目标
  • 常用的设计模式

    单例模式 简单点说 就是一个应用程序中 某个类的实例对象只有一个 你没有办法去new 因为构造器是被private修饰的 一般通过getInstance 的方法来获取它们的实例 getInstance 的返回值是一个对象的引用 并不是一个新
  • 数据库MySQL-索引(含常见面试题)

    目录 一 什么是索引 二 索引的作用 三 索引优缺点及场景 1 优点 2 缺点 3 使用场景 4 注意事项 四 索引的使用 1 索引分类 2 查看索引 3 创建索引 重点 4 索引和约束的区别 容易混淆 五 索引实现原理 索引失效 2 实现
  • Python——queue

    Queue Queue是python标准库中的线程安全的队列 FIFO 实现 提供了一个适用于多线程编程的先进先出的数据结构 即队列 用来在生产者和消费者线程之间的信息传递 基本FIFO队列 class Queue Queue maxsiz
  • C#设计模式——单例模式(Singleton Pattern)

    目录 一 概述 1 基础 二 实现 1 单线程 2 解决 多线程情况下 解决方案一 Sleep 解决方案二 加锁 三 扩展 一 概述 单例模式 gt 创建型设计模式 定义 保证一个类只有一个实例 并提供一个访问它的全局访问点 在第一个使用者
  • CentOS 6.5开启DHCP服务

    CentOS 6 5开启DHCP服务 安装dhcp yum install dhcp 配置Vmware虚拟网络编辑器 选择VMnet1网卡 选择 仅主机模式 取消使用本地DHCP服务 并设置子网IP与子网掩码 设置完点击 应用 设置Cent
  • 互联网未来30年发展的大趋势,专家:竞争会更激烈!

    未来互联网发展肯定是越来越快 越来越与各行业紧密融合 因此我们必须跟上趋势 顺着风向前行 互联网大佬马云曾说过 在互联网上失败一定是自己造成的 要不是脑子发热 要不就是脑子不热了 太冷了 专家分析互联网未来30年发展的10大趋势 1 政府推
  • Win11 21H2 22000.2124

    Win11 21H2 22000 2124是最新推出的非安全发布预览版更新 主要解决了一个影响桌面虚拟键盘的问题 该问题导致在锁定电脑后无法打开桌面虚拟键盘 改进 这一非安全性更新包括质量改进 当你安装这个kb时 新的 这一更新为微软维护者
  • VMware 下的CentOS6.7 虚拟机与Windows7通信

    在有网络的情况下 VMware 虚拟机使用桥接模式 Bridged 和NAT方式 会自动通信 但是在没有网络的情况下怎么办呢 对 是的 使用host only模式 如何设置呢 注 将Windows上的虚拟网卡改成跟Linux上的网卡在同一网
  • 将本地jar包打包到本地仓库和上传到私服

    1 本地jar打包到本地仓库 mvn install install file DgroupId 自定义的groupID DartifactId 自定义的artifactid Dversion 自定义版本号 Dpackaging jar D
  • 【网络编程】深入理解TCP协议一(三次握手四次挥手、标记位、确认应答机制、超时重传机制)

    TCP协议 1 三次握手四次挥手 2 TCP协议段格式 3 标记位介绍 4 确认应答机制 5 超时重传机制 1 三次握手四次挥手 当客户端发起连接请求时 SYN需要被设置位1 告诉服务器客户端希望建立一个链接 服务器收到响应之后会回复 SY
  • VUE项目中引入JS文件的几种方法

    在开发Vue项目的时候 有时需要使用一些非ES6格式的没有export的js库 可以有如下方法实现 1 在index html页面使用script标签引入 当然也可以使用cdn的地址 这样引入后的内容是全局的 可以在所有地方使用
  • 《区块链助力粤港澳大湾区一体化发展报告(2022)》发布

    7月19日 中国 深圳 综合开发研究院主办的 数 链 大湾区 区块链助力粤港澳大湾区一体化发展报告 2022 发布会在深圳举行 报告提出 以区块链为代表的数字技术在破解粤港澳大湾区制度差异坚冰 支撑实体经济跨越和赋能社会治理创新等方面能够发
  • Mybatis对数据库数据的查询

    简单类型的映射 返回的是简单基本类型 接口中的定义 int getAdminCount 返回数据库总共还几条数据 xml中具体的实现
  • 解决Android App启动页背景图片拉伸变形问题

    为什么80 的码农都做不了架构师 gt gt gt 最近在开发的时候 在个别手机上遇到APP启动页背景图片被拉伸的情况 不多说 直接上图 然而我设置的背景图片是长这样 解决方法很简单 就是将主题中的单一背景图片以drawable的方式实现
  • SpringBoot世上最简洁的概况说明

    转自 SpringBoot世上最简洁的概况说明 下文笔者讲述SpringBoot的简介说明 如下所示 SpringBoot简介 SpringBoot是一个基于Spring框架开发的一个服务框架 使用SpringBoot可简化配置 达到开箱即
  • 从视频中提取音频数据,然后应用傅里叶对音频降噪(python)

    视频准备 QQ有热键 然后随便打开一个视频网站进行录屏 我选择B站 从视频中提取音频 需要安装包moviepy pip install moviepy 提取代码 from moviepy editor import video VideoF