一、工具:电脑
二、 *** 作步骤:
1把视频或者内容用浏览器打开,各种浏览器都可以。
2然后,在空白处右键 查看源代码。
3这里很多人不知道的工具(内页查找ctrl F或者在浏览器的工具里有这个选项)。
4根据不同的内容,比如是个腾讯视频,那么输入vqq就可以查到其视频的代码了。
5这样就可以把视频的网址截取出来(一般以amp结尾都可以了)。
HTML5中的video和audio标签中有一个autoplay属性,添加这个属性后就会在文件加载完成以后自动播放。具体代码如下: video: audio。
构成
文字与是构成一个网页的两个最基本的。
元素。你可以简单地理解为:文字,就是网页的内容。,就是网页的美观。除此之外,网页的元素还包括动画、音乐、程序等等。
在网页上点击鼠标右键,选择菜单中的 “查看源文件” ,就可以通过记事本看到网页的实际内容。可以看到网页实际上只是一个纯文本文件。它通过各式各样的标记对页面上的文字、、表格、声音等元素进行描述(例如字体、颜色、大小),而浏览器则对这些标记进行解释并生成页面。
于是就得到你现在所看到的画面。 为什么在源文件看不到任何? 网页文件中存放的只是的链接位置,而文件与网页文件是互相独立存放的,甚至可以不在同一台计算机上。
网页通常有以下元素:
文字资料图像档案Applet(在页面内执行的副程式)超链结网页的合成体为网站,一个网站的开始点为首页。
记录功能
当你每次上网时,都会在历史记录里留下记录,并且被保存在浏览器的缓存文件夹里,删除时只要右键删除就可以了。
百度百科-网页
可以1 创建并配置MediaCodec
private val MIME_TYPE = "video/avc"
val format = MediaFormatcreateVideoFormat("video/avc", width, height)apply {
setInteger(MediaFormatKEY_COLOR_FORMAT, MediaCodecInfoCodecCapabilitiesCOLOR_FormatSurface)
setInteger(MediaFormatKEY_BIT_RATE, 5120000)
setInteger(MediaFormatKEY_FRAME_RATE, 25)
setInteger(MediaFormatKEY_I_FRAME_INTERVAL, 1)
}
mediaCodec = MediaCodeccreateEncoderByType(MIME_TYPE)
mediaCodecconfigure(format, null, null, MediaCodecCONFIGURE_FLAG_ENCODE)
mediaCodecstart()
复制代码
这里我们通过将帧渲染到surface上的方式向MediaCodec提供编码数据,因此KEY_COLOR_FORMAT是COLOR_FormatSurface,另外码率、帧率及关键帧间隔可根据需要设置。
2 创建EGL
什么是EGL?关于EGL的概念可以参考我的一篇文章《OpenGL ES 高级进阶:EGL及GL线程》,这里EGL的作用主要是2个,一个是向MediaCodec提供编码帧是通过将帧内容渲染到一个EGL Surface上,这个EGL Surface需要通过MediaCodec给出的input surface来创建,另一个作用是做texture的共享,因为编码通常会放到另一个线程里,和提供帧texture的线程不是同一个线程。
egl = EncodeEGL(shareContext, mediaCodeccreateInputSurface())apply {
init()
makeCurrent()
}
复制代码
然后将这个EGL绑定到调用线程中,我的demo是将编码放到一个独立的线程上,所以只makeCurrent就可以了,不需要之后再restore回来。
3 创建MediaMuxer
这个东西是用来进行视频容器封装的,编码只是得到了一堆视频帧数据,那播放器怎么知道怎样去播这堆数据呢?这时就需要容器这个东西,这里用的是mp4:
mediaMuxer = MediaMuxer(filePath, MediaMuxerOutputFormatMUXER_OUTPUT_MPEG_4)
复制代码
4 渲染编码帧
这里渲染编码帧就是很简单地渲染一个texture,没什么好说的,然后还要设置帧时间戳,这样播放器播的时候才知道什么时间播哪帧,最后swapBuffers完成渲染,这样就向MediaCodec提供了一个待编码的帧。
encodeRendererdrawFrame(texture)
eglsetTimestamp(timestamp)
eglswapBuffers()
复制代码
5 获取编码好的帧并将数据写入文件
这一步有点复杂,因为要处理的情况比较多,这里只把一些关键的步骤列出来。
首先dequeueOutputBuffer()将编码好的一帧的index拿出来,可以设置超时时间,如果在超时时间到达时还未获取到编好的一帧,就会返回,可以通过返回的值来判断是否成功拿到了编码好的帧index。
得到了index就从encoderOutputBuffers中取出编码好的帧数据,然后通过MediaMuxer将数据写入文件。
最后把dequeue出来的buffer再归还回去。
val ret = mediaCodecdequeueOutputBuffer(bufferInfo, 0)
encoderOutputBuffers = mediaCodecoutputBuffers
val encodedData = encoderOutputBuffers[ret]
encodedDataposition(bufferInfooffset)
encodedDatalimit(bufferInfooffset + bufferInfosize)
mediaMuxerwriteSampleData(trackIndex, encodedData, bufferInfo)
mediaCodecreleaseOutputBuffer(ret, false)
复制代码
现在来看一下demo:
Thread {
val egl = EGL()apply {
init()
bind()
}
val bitmap = decodeBitmapFromAssets("testpng")
Thread {
val videoEncoder = VideoEncoder()
videoEncoderinit("/sdcard/testmp4", 540, 540, egleglContext)
for (i in 0 until 100) {
val texture = GLUtilbitmap2Texture(rotateBitmap(bitmap, i 2f))
videoEncoderencodeFrame(texture, 100 i 1000000L)
GLUtildeleteTexture(texture)
}
videoEncoderencodeFrame(0, 0)
videoEncoderrelease()
}start()
}start()
复制代码
视频编码比较常见的使用场景是相机录像和将一个视频生成带特效的视频,简单起见,这里我把一张图旋转成不的角度来做为视频的帧,编码出一个540540的mp4视频,帧间隔为100ms,如果你有代码的话,只需要把你的代码copy到你自己的网页中就可以了。。然后运行出来,看到的效果就是视频了。。。其实这个不是把代码变成视频,而是你的这段代码里引用了别个网站上的资源(视频),属于引用。。
比如:
>
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)