导航:首页 > 源码编译 > 编译二进制视频

编译二进制视频

发布时间:2023-08-16 21:42:57

1. javascript可以用某种手段编译成一个二进制可执行文件吗

你可以把脚本用二进制方式写进图片或者视频里,但是这个东西对于网站的过滤来说,会变得很复杂。加入我在图片里插入了恶意脚本,你还允许我上传到服务器。那服务器就有可能被我通过那段恶意代码控制。
你写好一段js脚本,把它以二进制的方式添加到图片里,图片里面的图片类型要保留,然后加入/* xxxx */来注释掉图片内容。
在<script src=''><script>,src属性可以指定图片。

2. 怎么编译windows 64位版本的libav

libav是ffmpeg的一个分支,我纯粹是出于喜欢avconv和avprobe这样清晰的命名才对它有好感。
因为官方网站有一个编译指南,以下只是本人在实际编译过程中的一些问题点的记录。

编译环境准备
因为libav使用configure脚本来编译,所以必须要安装mingw的msys,这样可以有一个bash来运行configure脚本,以及保证一个可用的gnu make来执行编译。现在安装Mingw可以使用mingw-get,培嫌类似于一个包管理器,我们只需要msys的包和coreutils的ext包就可以了。
其次我使用VS2013 Express版本的msvc来编译。在之前版本的msvc,只需要安装Windows SDK那个光盘镜像就可以有一个命令行的编译环境了,但是VS2013之后,必须安装VS2013的光盘镜像才可以(Express版本足矣)。
另外libav中有汇编代码,语法是yasm,所以得下载一份windows版本的yasm。

依赖的第三方库准备
我只准备了zlib和libfdk_aac两个库,前者其实我不知道libav哪里用了,只是看到指南中有提及,就下载了,libfdk_aac据说是目前开源界最好的aac编解码库,只是因为用了一个custom的license,所以用它编译出来的二进制文件是禁止发布的,所以想用支持这个库的libav只能自己编译用。

按照指南中的说明来修改编译zlib即可,非常straight forward,只是要编译一个x64的zlib.lib有需要注意的地方;cl.exe编译object file的时候是没有选项来指定要生成32位还是64位的,相反的,它用不同的cl.exe用来实现这一点,使用vs2013的两个命令行快捷方式开启编译环境命令行即可(也就是给vcvarsall.bat传递不同的参数来打开相应的编译环境命令行,例如我安装的32位的VS2013 Express,就可以用vcvarsall.bat x86_amd64在PATH中准备好一个本身是32位的但生成的目标文件是64bit的cl.exe)。

libfdk_aac的代码中没有为msvc的toolchain来准备任何配置,所以我采用的最笨的方法:在VC中新建一个static library类型的工程,然后把需要的文件全部添加进来(除了aac decoder的部分),并且配置各种细节,来生成最后的64位的fdk-aac.lib文件。

configure libav
然后把zlib的头文件和libfdk_aac的encoder的头文件放到3rd/headers,把刚才生成的lib放到3rd/libs。正如指南中配誉手说的,msvc的toolchain会使用INCLUDE和LIB两个环境变量来确定头文件和库文件的位置;在打开vcvarsall.bat之后,这两个变量已经带了系统库的设定;而我们需要在./configure和make执行的时候,都要在这两个变量中加上我们的3rd环境;因为用msys的bash来运行,只需要在这两个命令前面虚前如此设置即可:
INCLUDE=3rd/headers/;$INCLUDE LIB=3rd/libs/;$LIB ./configure

还有需要删除mingw的link.exe,避免与msvc中的link.exe冲突,指南中也提到了。

另外附上我的configure参数,因为我的fdk-aac.lib中没有解码器,我专门声明了不使用它的解码器:

./configure --disable-debug \
--enable-gpl --enable-nonfree \
--enable-runtime-cpudetect \
--disable-avplay --disable-avserver \
--disable-encoder=aac \
--enable-libfdk-aac --disable-decoder=libfdk_aac \
--toolchain=msvc

libav本身的修改和make
libav在windows下,会把通过GetCommandLineW()来获取UTF-16LE版本的命令行参数,并转换成UTF-8之后才进行后续的所有操作(libav内部都是用UTF-8来统一对待字符串编码的);但是在往控制台打log的时候,直接用fputs接口向stderr打印UTF-8的multibyte字符串,在CP_ACP(ANSI codepage)为gbk的中文windows上,字符串中的非ascii字符(例如刚才命令行传入的中文文件名)就会打印为乱码(因为系统用GBK来解码UTF-8的字符串)。
解决方案是:
先用MultiByteToWideChar()把待打印的UTF-8 multibyte字符串转换回UTF-16LE的wchar_t字符串;
这时候如果用fwputs来打印转换后的字符串,会发现一遇到非ascii字符就会调用失败(打印停止),这是因为默认的locale中的LC_TYPE(这个locale category专门控制字符相关的操作的)是"C",用setlocale(LC_TYPE, "")设置为系统默认(中文系统为GBK),或者显式调用setlocale(LC_TYPE, ".936")设置为GBK,就能成功打印出UTF-16LE中的GBK能表示的字符;
但是这个locale+fwputs的方案只能显示出一种ANSI方案支持的字符,想显示出所有UTF-16LE支持的字符,应该直接使用windows的API调用,WriteConsoleW(GetStdHandle(STD_ERROR_HANDLE), wcMsg, wcMsgLen, &wcMsgLen, NULL)。
以下是我对libavutil/log.c的patch:

--- log.c 2014-08-04 10:02:34 +0800
+++ libav-64bit/libav-10.3/libavutil/log.c 2014-09-10 06:42:02 +0800
@@ -59,6 +59,10 @@

static void colored_fputs(int level, const char *str)
{
+#if HAVE_COMMANDLINETOARGVW && defined(_WIN32)
+ int wcBufLen = 0;
+ wchar_t* wcBuf = NULL;
+#endif
if (use_color < 0) {
#if HAVE_SETCONSOLETEXTATTRIBUTE
CONSOLE_SCREEN_BUFFER_INFO con_info;
@@ -83,7 +87,19 @@
if (use_color) {
set_color(level);
}
+#if HAVE_COMMANDLINETOARGVW && defined(_WIN32)
+ wcBufLen = MultiByteToWideChar(CP_UTF8, 0, str, -1, NULL, 0);
+ if (wcBufLen == 0) {
+ fputs("Failed to convert multibyte log string to widechar.\n", stderr);
+ exit(1);
+ }
+ wcBuf = (wchar_t*)malloc(wcBufLen *2);
+ wcBufLen = MultiByteToWideChar(CP_UTF8, 0, str, -1, wcBuf, wcBufLen);
+ WriteConsoleW(GetStdHandle(STD_ERROR_HANDLE), wcBuf, wcBufLen, &wcBufLen, NULL);
+ free((void*)wcBuf);
+#else
fputs(str, stderr);
+#endif
if (use_color) {
reset_color();
}

使用avconv的简易教程
avprobe xxx.mkv
看清音轨是哪个,也就是一个数字音轨号;其实大部分时候一个容器中的所有音轨都是一种格式的,所以其实也不用看,下面用a指定所有的就好了

avconv -i xxx.mkv -c -c:1 libdfk_aac out.mkv
以上把1号轨按照aac重新编码,别的轨全部对拷
avconv -i xxx.mkv -c -c:a libdfk_aac out.mkv
以上把所有音轨按照aac重新编码,别的轨全部对拷
avconv -i xxx.mkv -i xxx.srt -c -c:a libdfk_aac out.mkv
以上演示另外附加一个srt,注意所有的-c参数都要放在所有-i文件之后

如何去掉输入文件中的某些轨呢(需要借鉴avprobe xxx.mkv的输出了):
avconv -i xxx.mkv -c -c:a libdfk_aac -map 0 out.mkv
以上语句实现功能跟不加-map 0一样,map 0是说把第0号输入文件中的所有轨都输入到out.mkv
avconv -i xxx.mkv -c -c:a libdfk_aac -map 0:v out.mkv
以上语句讲只输出视频轨
avconv -i xxx.mkv -c -c:a libdfk_aac -map 0:v -map 0:1 -map 0:s out.mkv
如果输入文件中0为视频,1和2均为音频轨,3和4为字幕轨,以上语句可以只输出0 1 3轨,不输出2号音频轨
avconv -i xxx.mkv -c -c:a libdfk_aac -map 0:0 -map 0:1 -map 0:3 -map 0:4 out.mkv
以上功能相同,只是完全用轨的数字序号来表示
avconv -i xxx.mkv -c -c:a libdfk_aac -map 0 -map -0:2 out.mkv
以上功能相同,只是用“负”来表示从之前形成的map中去掉指定的轨
注意map选项用在输出之前,所有-i之后
某些文件(例如avi)在remux到mkv的时候会报错,给avconv加上-fflags +genpts一般能解决

3. 二进制如何编程

1、打开易语言新建一个windows程序进入下图界面。

4. c语言的编译过程是什么

c语言的编译过程如下:
1、预处理:预处理过程实际上是处理“#”的过程:#include包含的头文件直接拷贝到hello.c中;#define定义的宏定义进行替换,同时删除代码中没有的注释部分。2、编译:编译的过程实质上是将高级语言翻译成机器语言的过程。3、汇编:汇编器是将汇编代码转变成机器可以执行的命令,每一个汇编语句几乎都对应一条机器指令。汇编相对于编译过程比较简单,根据汇编指令和机器指令的对照表一一翻译即可。4、链接:就像hello.c中使用到了C标准库的东西“printf”,但是编译过程只是将源文件翻译成二进制文件而已,这个二进制文件还不能直接执行,还需要一个动作:将翻译成的二进制文件与需要用到的库绑定在一块。
补充:编译过程可分为6步:扫描(词法分析)、语法分析、语义分析、源代码优化、代码生成、目标代码优化。

5. 如何将一个函数编译成二进制文件

通过下面这条命令,main.c和swap.c 就产生了一个可执行二进制文件swap

》gcc mian.c swap.c -o swap

那么这条命令是么样把源程序变成可执行程序的呢?

步骤如下:

1、驱动程序首先调用C预处理器(CPP)把源文件翻译成一个ASCII中间文件mian.i,预处理器会把#include所包含的内容都插入到声明的位置,并且做宏替换,把main.c 文件的第3行 的SIZE替换成2(注意这里只是做简单的文本替换)。

2、接下来驱动程序的C编译器将main.i翻译成汇编语言程序main.s

3、然后驱动程序的汇编器将汇编语言程序main.s 翻译成可重定位的二进制文件main.o

4、最后运行链接器将main.o 与swap.o 以及一些必要的系统目标文件(比如你将调用的printf函数就是printf.o)连接起来变成一个可执行的二进制文件。

6. python如何编译生成二进制文件

用py2exe 打包成可以执行文件

7. c语言是如何编译成二进制

计算机专业有门课程叫做《编译原理》,详细讲述了怎么把高级语言翻译成汇编语言活着机器能看懂的二进制代码。

简单的说,C语言是通过编译器翻译成二进制代码的(就像英译汉的软件把英文翻译成汉语一样。把高级语言翻译成机器语言过程很复杂,学了编译原理就懂了)。还有编译器可以用各种语言编写,C语言可以被用C语言写的编译器来编译。

8. C/C++语言编译生产可执行的二进制文件的过程求大神详尽解释,

  1. 预编译。编译器将你的.c、.cpp源代码,通过解释其中的预编译指令,将源代码转换成相应的没有任何预编译指令的代码。

  2. 编译、优化。将上一步的代码编译成汇编指令,并作一定优化,形成对应的.s汇编代码

  3. 汇编。将.s文件汇编成机器码,形成对应的.o目标文件,此时是不可执行的二进制文件。生成对应的清单文件。为了连接需要,还会生成未定向符号表、导出符号表、地址重定向表等等。

  4. 连接。先根据对应的清单文件、连接文件及之间的调用关系,决定所有的目标文件及引用的库文件在最后可执行文件中的位置;然后做一些其他事情,比如根据符号表等将目标文件中的符号地址补全等等;最终得到可执行文件。

这只是我个人的简单理解,更详尽的解答都可以写成好几本书了=_=望采纳~

9. 如何编译nodejs的二进制模块

god Buffer类是一个全局的直接处理二进制数据类型。它可以以各种方式构造。 look
sex 纯Javascript对于Unicode的处理是友好的,而对二进制并不友好。但处理TCP数据流和文件系统,必须要处理字节流,所以node.js提供一套策略来创建和操作字节流。 sex
googog 数据储存在一个Buffer实例中,一个Buffer的大小是固定的,类似于不可变的整数数组。 good
look Buffer与字符串之间的转换需要指定明确的编码。 googog
this Buffer支持的编码: book
yellow 'ascii'编码,只为7位的ASCII的数据。这个编码方法非常快! googog
god 'utf8' 编码,支持Unicode字符。 yellow
yellow 'utf16le' 编码,小端编码的Unicode字符。对(u10000 ~ u10FFFF)的支持。 fuck
book 'ucs2' 是 'utf16le' 编码的别名。 god
look 'base64' 是 Base64字符串编码。 this
good 'hex' 表示十六进制编码,每个byte编码为两个十六进制字符。 look
sex 一个Buffer对象也可以使用一个类型数组。Buffer对象克隆到一个ArrayBuffer,用作类型数组存储支持。node.js提供的Buffer和标准类型化数组是两套不同的系统,所以Buffer和ArrayBuffer的内存不共享。 sex
sex 注意:虽然V8提供了标准化的类型化数组,但node.js自身定义的Buffer提供了更灵活强大的API,在之后的章节会详细讲解两者的转换与使用方法。 good

10. centos 7怎么安装编译安装二进制文件

安装软件包

rpm [option] /path/to/package_file

-i:安装

-v:显示安装详细信息

-h:以#号显示安装进度,每个#号代表2%的安装进度

组合用法:rpm -ivh /path/to/package_file

--nodeps:安装时忽略依赖关系。(此方式安装的软件可能运行不了)

--test:测试安装,不是真正的安装。

--replacepkgs:重新安装(如果原有配置文件作了修改,很有可能不执行替换,而是将应该安装生成的配置文件重命名为 .rpmnew)

卸载软件包

rpm [option] package_name

-e:卸载(如果包的配置文件安装后曾被改动过,卸载时,此文件将不会卸载,而是被重命名并保留,例如warning: /etc/zprofile saved as /etc/zprofile.rpmsave.)

--nodeps:卸载时忽略依赖关系(卸载后,依赖次软件包的程序可能无法正常运行)

升级软件包

rpm [option] /path/to/package_file

-Uvh:升级或安装,如果旧版本的软件包不存在,则安装此软件包;如果旧的软件包存在,则升级旧软件包。

-Fvh:纯升级,如果旧版本的软件包不存在,则不安装此软件包;如果旧的软件包存在,则升级旧软件包。

注意:不应该对内核执行升级操作,而是安装。系统允许多内核并存

阅读全文

与编译二进制视频相关的资料

热点内容
安卓怎么用支付宝交违章罚款 浏览:663
php面向对象的程序设计 浏览:504
数据挖掘算法书籍推荐 浏览:894
投诉联通用什么app 浏览:150
web服务器变更ip地址 浏览:954
java正则表达式验证邮箱 浏览:360
成熟商务男装下载什么软件app 浏览:609
加密2h代表长度是多少厘米 浏览:23
拍卖程序员 浏览:101
电脑的图片放在哪个文件夹 浏览:274
unsignedintjava 浏览:216
编译器下载地址 浏览:42
什么是面对对象编程 浏览:708
b站服务器什么时候恢复 浏览:721
6p相当于安卓机什么水准 浏览:498
能否给隐藏相册加密 浏览:596
糖心app改什么名 浏览:824
战地1控服务器如何部署 浏览:395
xp还原系统输入命令 浏览:324
mysql命令行版本 浏览:305