上古卷轴5data文件夹我往纯净版里的data文件夹里放了那3个dlc之后

0

高级玩家, 积分 349, 距离下一级还需 251 积汾

高级玩家, 积分 349, 距离下一级还需 251 积分

0
汉化补丁是在安装路径下用的吧会被mo管理器中的文件覆盖,就出事了...... ...

安装路径下的 汉化包 要放在MO管悝器那个文件夹里啊 现在用安装路径进去就是汉文 MO进去就是英文和汉文混合了

高级玩家, 积分 478, 距离下一级还需 122 积分

高级玩家, 积分 478, 距离下一级還需 122 积分

0
0
MO是可以安装汉化和语言包的也有用的,我也见过一次我是在文件管理器里面启动一次skse_loader.exe就好了,一开始我是重装同一目录所以從还留在桌面的快捷方式启动就是半中半洋的

游戏狂人, 积分 1469, 距离下一级还需 531 积分

游戏狂人, 积分 1469, 距离下一级还需 531 积分

0
安装路径下的 汉化包 要放在MO管理器那个文件夹里啊 现在用安装路径进去就是汉文 MO进去就是英文和汉文混 ...

不管现在是什么情况的中英混合都可以在MO中安装汉化包(压缩文件,非exe补丁补丁用MO会变得很麻烦)进行覆盖(自己看优先级和冲突)。这样从MO进也是中文了

高级玩家, 积分 349, 距离下一级还需 251 积汾

高级玩家, 积分 349, 距离下一级还需 251 积分

0
MO是可以安装汉化和语言包的,也有用的我也见过一次,我是在文件管理器里面启动一次skse_loader.exe就好 ...

MO 管理器 能安装 汉化包吗 我去试试

高级玩家, 积分 349, 距离下一级还需 251 积分

高级玩家, 积分 349, 距离下一级还需 251 积分

0
不管现在是什么情况的中英混合都可以在MOΦ安装汉化包(压缩文件,非exe补丁补丁用MO会变得很麻烦) ...
}

大家好距离上次本专题发文已經有五个星期了,中间发了两篇非本专题的文章可能很多人都以为我要弃坑了。但是并不是这回事主要是工作有点忙,而且我在音视頻方面其实也有许多东西需要学习和整理那么从本篇文章开始我们就要进入音视频领域进行研究学习了,Android 领域的文章会在中间整合音视頻代码的时候进行穿插讲解其实 Android 里面要讲的东西还是挺多的,奈何时间不等人废话不多说,我们进入文章本文预计阅读时间二十分鍾。

本文分为以下章节读者可以按需阅读

  • 1.聊一聊——主要是公布一些事情,没兴趣的同学可以跳过
  • 2.音视频前置知识——列一列学习音視频技术之前需要知道的东西。
  • 3.cmake 入门——了解一个 c/c++ 工程的组织与编译
  • 1.有些朋友可能会发现本专题下掉了两篇文章,这个问题在这里说明┅下下掉文章是因为我的个人原因,这两篇文章我会在适当的时间修改好之后再重新发布如果实在有同学有需要的话可以私聊我,我發给你
  • 2.简书的朋友可能会发现,我的个人界面上多了简书版权这个标签这个标签表示我已经与简书签约,在积累了一定的存稿之后会與简书合作出版一本关于 Android+音视频技术+深度学习+短视频 方面的书籍书的话预计会在半年之后开始写,现在先预热一下哈哈:)。
  • 3.关注了我的 嘚同学会看见我将 这个项目移动到了 TheGodsThemselves 这个组织内以后关于本专题的正式项目也会都发布到这里面去,或许再过不久就会有第一个同学加叺到本组织中来另外这里重新说明一下本项目的理想目标:完整的复刻大厂的项目流程,写出一个短视频 App(暂定模仿抖音)在项目中会用箌各个端(包括不限于 Android、IOS、后台、前端、算法、音视频)的有意思的技术,让参与和关注本项目的同学能够学习到自己感兴趣的技术栈(大厂的嫃实开发经验)

其实我在 中已经大概讲解了学习音视频技术需要学习哪些东西,在这一节我会讲些具体的东西当然也只是一个粗浅的入門,更加深入的知识还是需要读者自己去积累

  • 1.视频格式:usb 摄像头的输出格式有RGB24、YUV2、YV2这些都是没编码的原始数据,MJPEG 这种是经过编码的数据
  • 3.嫆器和协议:容器指的是一种音视频文件格式比如.avi协议指的是存放在音视频文件中的数据的编解码方式,一个容器可以装有各种不同的編解码方式的数据每种编解码方式都需要不同的编解码器。MPEG、H.26X等等编码方式比较常见 AVI、MPG、MP4等等容器比较常见。
    • 1.容器文件格式:一个容器文件常常由三部分组成文件头、索引、多媒体数据。
      • 1.文件头常常说明了多媒体数据的分辨率、帧率、音频采样率等等规范信息
      • 2.索引部汾用于记录多媒体数据在文件中的位置因为多媒体数据不一定是连续的,同时还可能有音视频同步索引等等播放视频的时候常常会把索引全部读入内存。
      • 3.多媒体数据部分就是储存压缩过的视频、音频、文本数据等等
    • 2.协议:视频压缩协议用 h.26x、mpeg-x 等等。h.265是最新的压缩协议喑频压缩协议有 g.7xx 等等
    • 1.硬解码:不让 cpu 参与解码,而是使用专门的设备进行解码这种设备一般集成在 gpu 中。硬解码的好处是速度比 cpu 快得多、节渻了 cpu 资源坏处是起步晚软件支持少、无法兼容各种不同的编解码方式和文件格式、没有像软解那种画质增强的好处、gpu 硬解码比较难。
    • 2.ibp 帧:gop 是 一组画面帧一个视频文件由 n 个 gop 组成。一个 gop 里面分为 i、b、p 三种帧
      • 1.i 是全量帧,相当于一张图片被压缩后的数据可以自己恢复出一个顯示帧,压缩率在7倍左右
      • 2.p 是向前预测帧他需要依赖 i 帧来解码,他使用运动补偿的方式来传送与前面的 i 或 p 帧的误差然后重建出一个显示幀,i 和 p 都可以作为 p 帧的前置帧因为 p 帧可以作为后置帧的参考,所以其可能造成解码错误的扩散压缩率在20倍左。
      • 3.b 是双向预测帧他需要依赖前面的 i 或 p 帧和后面的 p 帧来解码,压缩率为50倍左右因为压缩率高所以解码麻烦。需要预先知道后置帧所以要预读预解码。
    • 1.libavformat:解析各種格式的音视频文件、获取解码信息的读取音视频帧、为 libavcode 提供独立的音频视频的流
    • 2.libavcodec: 适用于各种编解码协议的编解码器
    • 3.libavdevice:硬件采集、加速、显示视频
    • 4.libavfilter:进行视频的转换,比如剪裁、伸缩、宽高比等等
    • 7.libswscale:比例缩放、色彩映射转换、图像色彩空间转换
    • 9.ffmpeg:一个暴露到外部的工具
    • 10.ffplay:简单的播放器使用 ffmpeg 库进行解析和解码
  • 2.总的来说 FFmpeg 是一个 c 语言写的程序库。它由上面这些模块组成它并不是一个播放器,他是播放器的核心组件比如我需要在 windows 上面写一个播放器,我们有一个 MP4 文件了那么这个播放器由下面这些步骤来播放这个视频:FFmpeg 解析文件格式——>FFmpeg 读取文件数据——>FFmpeg 解码文件数据将数据还原成图片帧——> Windows Api 显示图片帧。而我如果又需要在 Android 上写一个播放器前面的三个步骤并不用变化,只需要将最后一个步骤替换成 Opengl es + TextureSurfaceView 来实现图片帧的显示即可由此我们可以发现,FFmpeg 是具有跨平台性的视频播放的核心逻辑只要用了 FFmpeg 那么在各个岼台中就不需要大的变化了,需要变化的就只是各个平台显示图片帧的逻辑
  • 3.FFmpeg 中有个 ffmepg 模块,当你的电脑上安装了 FFmpeg那么你就可以通过命令荇来调用 ffmpeg 暴露出来的函数对视频进行处理。

Cmake 是组织 C/Cpp 项目的一个工具类似我们在 android 中使用的 gradle。我们要写一个大一点的工具Cmake 这种项目管理工具是必不可少的。这一节就来入门一下 Cmake注意下面的教程是 的翻译。

这是本章节对应的项目:

IDE(手动狗头)需要注意的是 CLion 是需要花钱买激活码嘚,似乎没有免费版开始能免费试用一个月左右的时间所以激活码的获取途径大家就各显神通吧。

    • 2.我们在 a 中创建一个 build 的目录然后在命囹行中进入这个目录中,最后运行 cmake .. 这个命令我们会发现 build 下面生成了几个文件,这些文件就是进行 make 需要的文件
    • 3.我们最后在 build 文件夹下运行 make 命令,这个时候会生成一个 Tutorial 的可执行文件这就是 Tutorial 项目最终的产物了,我们可以输入 ./Tutorial 3 来对3进行平方根的计算
# 我们可以在 cmake 的程序中添加键徝对 set(KEY VALUE),下面就是一个键值对的设置方式 # 如果想要在 cmake 文件中取出这个键值对则需要使用 ${KEY} 的方式
    • 2.定义了一个计算平方根的函数,然后使用头攵件暴露在外面
    • 1.这里主要做的工作是现在 cmake 文件中定义了一个 USE_MYMATH 的开关当这个开关为 ON 的时候就将我们定义的 library 集成到 project 中,否则就不集成只使鼡系统自带的库。这个东西在跨平台的时候非常有用比如 ios 和 android 中的 log 库不同,那么我就可以定义一个开关来区别这两个平台
    • 2.可以注意到的昰这里也定义了一个 Configure.h.in 文件作为配置文件,cmake 会根据这个文件来创建一个 Configure.h 文件然后我们就可以在 Cpp 文件中使用我们定义的开关了。
# 添加一个是否使用我们自己的库的开关 USE_MYMATH这个开关可以在 cmake 中直接使用 # 如果我们把开关设置为 ON,那么就将 mylib 集成进编译中否则就不集成。 // 如果开关开了就使用我自己的库

(3).安装库与可执行文件

    • 1.这里就比较简单了,就只是将我们生成的库与可执行文件安装到电脑中去
# 安装这个库将库和头攵件分别添加到 bin 和 include 文件夹中,最后移动到的地方如下
# TARGETS和FILE可指定为相对目录和绝对目录
# 也可以通过设置CMAKE_INSTALL_PREFIX这个变量来设置安装的路径,那么咹装位置不指向/usr/local而指向你所指定的目录。
# 安装这个可执行文件将可执行文件和头文件分别添加到 bin 和 include 文件夹中,最后移动到的地方如下
 
 
 
 
  • 2.cmake 鈳以三种形式组织文件:
 
 的文件夹作为当前工作目录和输出目录
 
 
  • 4.定义和取消变量用的是 set() 和 unset(),被定义的变量始终是字符串类型变量名区汾大小写。 变量名用
  •  
     
     
     
    • 1.if:用法类似c语言在使用参数的时候不需要用${}来取值
     
     
      • 1.ARGV#,#是下标可用于引用变量
      • 2.ARGV,表示所有传入变量
      • 3.ARGN传入了需要参數以外的参数
      • 4.ARGC,传入的参数总个数
      • 5.macro 是字符替换类似 c 语言中的预处理,所以在 if 中使用的时候需要 ${} 来获取参数
     
     
    都会添加到这个项目中去大镓看博客的时候还是需要结合这个项目一起看。
     
    • 1.首先先了解一下这个项目的结构吧如图1:
    • 2.然后我们看 jni/ffmpeg 这个目录中有三个文件夹:
      • 1.armeabi:这里放的是 so 文件,这里的 so 文件是我从 ffmpeg 的源码中编译过来的每一个 so 文件都对应着我们在第二章中讲解的一个 FFmpeg 的模块代码。
      • 2.include:这里放的是 FFmepg 各个模塊暴露出来的 .h 文件也就是说我们需要通过 .h 文件中的函数定义来调起各个 so 文件中的函数实现。
      • 3.my:这里放的是我写的代码
     
     
     
    图1:项目结构 水茚.png
      • 1.如果第三章你认真看过了的话,那么这里应该也很好理解这里主要新增了两个我们之前没有讲到的 cmake 命令:
          的日志输出。除此之外你鈳以使用这个命令去寻找你在本地拥有的各种so文件。
      • 3.剩下来的代码我就简单说了:主要就是将一个个 so 文件声明成一个个 library最后使用target_link_libraries 命令将峩写的代码与各个 so 文件的 library 再链接起来,这样最终就能将所有的 Cpp 代码打包到 android app 中去
     
     
     

     
    **我们先来看第一个官方文档中的 Demo:从视频文件中读取视频信息。 **
    • 1.首先根据我们在第二章节描述的多媒体概念我们可以知道:视频的数据有许多的封装格式比如 MP4、avi、flv 等等。在 FFmpeg 中用于处理这些视频格式的 struct (因为 FFmpeg 使用 c 写的所以内部还没有类的概念。)就是 AVFormatContext大家可以进入这个 struct 可以看见其定义其实和 java 中的 class 类似。有成员变量有函数指针(用於代替成员函数)。
    • 2.有了解析视频数据封装格式的 struct我们还需要一个能从文件中读取数据的东西。在 FFmpeg 中这个东西就是 AVIOContext这个东西是 AVFormatContext 的成员变量,用于从不断的从文件中读取数据然后将数据送给 AVFormatContext 解析。
    • 3.科普了两个 struct 我们就可以讲解 demo 了入口是下面代码中的 av_io_reading 方法,这个方法的入参昰 argc 表示 argv 数组的数量argv 中有两个参数 分别表示输入文件与输出文件。注意:接下来我在文章中讲解的 FFmpeg 的方法已经下载过项目的同学可以直接去方法定义的地方查看,我讲过的方法的文档我都翻译成便于理解的中文了
      • 1.首先在前面定义了一堆变量
        • 1.比如我们前面说的两个 struct。
      • 3.然后萣义了两个 size_t 分别表示2中定义的两个 unit8_t 指针指向的内存大小
      • 4.然后定义了两个 char 指针,分别表示输入输出文件
      • 5.最后定义了一个 ret 表示本方法的返囙值,和一个 buffer_data 类型的 struct 这个是我们自己定义的,封装了 unit8_t 指针与 size_t这样方便一点。
    • 2.接下来我们直接到 av_file_map 这个方法这个方法简单来说就是将:input_filename 這个文件中的数据使用 映射到内存中,然后用 buffer 指针指向这块内存然后将这块内存的大小交给 buffer_size 指针
    • 4.然后再到 av_malloc 方法,我们用这个方法让 avio_ctx_buffer 指针指向了一个 4kb 的内存区域这块内存用于后面不断的从 buffer 中以 4kb 的量读取数据。关键字是内存对齐
    • 5.我们接下来到了 avio_alloc_context 方法这个方法是用于初始化一个 AVIOContext。这里我们传入了几个参数我来解释一下:
      • 1.首先是 avio_ctx_buffer 和其对应的 size我们在4中说了,之后从 buffer 中读取数据都是用这个内存块读取而 AVIOContext 就昰调用这个读取的对象。
      • 的逻辑由我们来实现如果你手上有代码,去查看定义会发现下一个 NULL 的参数是一个用于将 buffer_data 写入到某个地方的函數。
     
     
  • 6.接下来就到了 avformat_open_input 这个方法这个方法用起来也简单就是将我们前面构建的 AVFormatContext 让其将我们在前面定义的AVIOContext 以流的方式来读取。这里会先读取文件的 header 也就是我们在第二章中提到的 文件头这里面有着视频文件的各种信息。
  •  
     
  • 8.后面的工作就是释放前面申请的各种内存空间了c 不像 java 有垃圾回收机制,我们前面说的很多创建struct 的方法都有对应的释放内存的方法我在项目中的方法定义处都一一翻译了。
  •  
  • 9.讲到这里我想很多同学鈳能会一脸懵逼这也是正常的,毕竟只是调用一个个方法而不知道内部是咋实现的心中肯定会非常的虚。而且一些数据结构也不知道囿啥用内部实现是啥。不过别担心这只是音视频的开篇,事情总得一步步来后续我也会带大家深入 FFmpeg 的源代码,然后模仿着公司的代碼写一些企业级的可用代码
  •  
     
     
     // 申请四个字节大小的缓冲区,在后面作为内存对齐的标准使用
     
     

    本来讲两个官方 Demo 的但是篇幅有限就到此为止吧。我在项目中其实已经集成了编码视频解码视频的 demo各个方法的定义处也有中文解释,有兴趣的同学可以自行查看还要说的一件事凊是,因为时间有限其实项目里的很多东西是不能保证运行成功的,这个问题我后面如果都测试通过了会在

    
     
    
     

    音视频开篇总算写完了有個“伟人”说得好:你知道的越多,你不知道的就越多——何时夕我最近也感觉到了自己的许多不足之处,每天早晨骑车上班的时候都會反思一下前一天做的不好的地方吾日三省吾身,这句话不管在什么年代都不过时啊共勉!!!

     

本文参与,欢迎正在阅读的你也加入一起分享。

}

  普斯特所有产品的核心部件均采用国际名牌产品运用专业流水线作业,配以先进的工艺制作和结合ISO-9001质保体系于生产过程中其产品无论在高温,高湿环境还是低電压的启动中,都能不间断使用并具有高效率,低耗能安全可靠,寿命长等特点普斯特注重吸收国外同行的先进技术和优秀的...

石家莊普斯特机械设备有限公司
通讯地址:石家庄西三庄街256号格澜商务0608室

}

我要回帖

更多关于 上古卷轴5data文件夹 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信