皮皮网

【同花顺咸鱼一阳指指标源码】【高端发卡平台源码】【cc 绘图软件源码】内核源码 sample_内核源码mk

来源:emwin源码6 时间:2024-12-23 21:09:06

1.dstwo烧录卡金手指_dstwo烧录卡金手指_烧录卡的内核内核金手指
2.视频和视频帧:FFMPEG+Intel QSV硬解的环境安装篇
3.Linux应用开发第八章ALSA应用开发
4.FFmpeg读取Assets资源文件

内核源码 sample_内核源码mk

dstwo烧录卡金手指_dstwo烧录卡金手指_烧录卡的金手指

       说明/DSTWO

       DSTWO烧录卡

       强大的硬件架构注定了DSTWO的不平凡。 硬件方面,源码源码DSTWO采用了先进的内核内核软件反烧录技术,无需对ROM打补丁,源码源码完全模拟原卡的特点,实现了非常稳固的内核内核游戏反烧录,保证了玩家的源码源码同花顺咸鱼一阳指指标源码手游体验,并拥有超强的内核内核CPU处理能力,内置GBA/SNES模拟器,源码源码使其实时功能非常超强,内核内核可以随时任意的源码源码呼出菜单。

       同时,内核内核DSTWO采用简单外形,源码源码做工扎实,内核内核充分展现了Super Card小组为此卡的源码源码用心。

       超强的内核内核处理器也带给了非凡的硬件功能。

       DSTWO即时菜单共分六个小块,分别为:即时攻略,金手指,即时存盘,即时读档,慢动作,DS游侠。

       在即时攻略上,DSTWO支持了BMP格式攻略,可以使玩家在游戏中随时查看游戏攻略,帮助游戏。

       金手指可以使玩家任意打开,使用而不需退出游戏进行设置。

       即时存档与读档方面SC小组利用其优秀的科技为玩家提供了一个更加稳定的记录读取系统。

       游戏慢动作功能抛弃金手指方法控制游戏速度,实现对主机CPU精确控制,实现游戏降低。

       DS游侠可以使玩家在没有金手指的状况下,直接借助游戏进行数据查找与设置。

       内核方面,目前DSTWO最新内核版本支持ndsi,同时,在3DS上市之初,快速发布对于其内核,使3DS成功运行nds游戏。

       华丽的界面UI

       同样,DSTWO支持电子书,视频播放等功能:

       电子书(支持多种格式——BMP,JPEG,JPG,PNG,TIF,gif,txt,pdf [Moonshell]:ipk)而这无非也是DSTWO的起初,全新的硬件架构带来的是一个新的系统。而不是局限于DS平台。

       影音播放,依靠DSTWO内置CPU硬件解码无需转化直播RMVB、AVI、FLV等格式的高端发卡平台源码视频或者MP3,APE,FLAC无损音频等。

       DSTWO 可播放影音文件参考:

       视频[ DSTWO Player ]:RMVB 、RM、FLV、WMV、ASF、AVI (P以内流畅播放,支持srt字幕)

       [Moonshell]:DPG

       音频[ DSTWO Player ]:MP3、WMA、APE、FLAC。

       [Moonshell]:OGG、NSF、GSM、MOD、SPC

       功能/DSTWO

       全新的硬件架构不但确保了超强的性能,也对反烧做了相应的优化,采用硬件反烧方法。软件反烧录,需要对ROM打补丁,有兼容问题。硬件反烧录,不需要对ROM打补丁,完全模拟正版卡的特性

       DSTWO

       DSTWO独占功能,利用超强的软件推动。能自已查找出游戏主角的生命值,金钱等参数,并可以设置和锁定。该功能在金手指发布前更加实用。类似手机的“金山游侠”。

       DSTWO

       舍弃了之前的金手指慢动作实手指性质“慢动作”不会随游戏画面差异,减慢速度有持续波动,稳定性,兼容性更好。

       打开文件浏览器即可自由对存储卡上的文件进行剪切,复制,粘贴,删除等实用操作,使您可以摆脱电脑方便地进行一些简洁的文件操作。

       DSTWO

       美化小图标,显示内容更多。支持照片攻略,从此您再也不用担心在复杂的迷宫中找不到道路了;另外,支持直接调用.txt格式文本文件的支持,使用非常方便。

       DSTWO

       即时存档增加为4个档位,每个档位独立使用。此外,加入了3D数据智能测试用途,提高3D游戏存档的兼容性,使其能更稳固地支持实时存档。而且,继承以往即时存档的读写快速性.

       加强了金手指易用性,兼容主流的DAT金手指库格式,玩家的金手指文件来源也将变得广阔;同时,在支持DAT文件的同时,依然继承了Supercard独家实时金手指的即时性.

       GUI完全重新制作,带给您崭新的cc 绘图软件源码华丽界面;同时,贴心制作的各项菜单也将带来您更友善的客户感受;触控操作,省时省力!

       使用说明/DSTWO

       新用户使用步骤

       步骤 1

       下载官网OS将_dstwo文件夹解压到TF卡根目录下。

       步骤 2

       将TF卡插入dstwo

       步骤 3

       将dstwo插入ds的slot1卡槽.

       基本操作

       上/下/左/右键位

       方向键上 / 下 移动鼠标,方向键左右 游戏多时可迅速翻页

       打开 / 关闭文件

       START

       调出系统菜单

       SELECT

       切换文件列表显示模式

       DStwo系统菜单介绍

       文件操作

       可对TF卡内的文件做“复制”、“剪切”、“粘贴”、“删除”操作

       补丁

       允许用户打开/关闭已有的游戏补丁

       金手指

       宏观开启/关闭金手指,设置/更改金手指

       存档

       有4个普通存档位供选择

       调光

       四节亮度调节(DS、DSL型号以外的主机无效)

       界面风格

       选择自己偏爱的界面主题色调

       语言

       可以更换9种语言

       显示

       列表/图标方式显示文件目录

       游戏提升功能(游戏中同时按 L+R+ABXY调出菜单)

       问题解答FAQ/DSTWO

       问:怎样与GBA联动呢?

       答:使用方式: NAME.nds,NAME.nds.gba,NAME.nds.gba.sav这三个文件分别为NDS游戏文件,GBA游戏文件,GBA游戏存档。其中NAME可由用户自己定义,但要统一设置这三个文件的NAME。这个功能由用户选取开启,在游戏选择图标中开启start菜单,系统设定选项中选择。

       问:DSTWO与其他产品有哪些差别?

       答:DSTWO是真正含义上的第二代烧录卡,内置高性能CPU,所以能完成模拟GBA以及更多强悍的功能,这是其他没有CPU产品绝对做不到的。

       问:DSTWO内核怎么安装?

       答:请看使用表明

       问:为什么拷贝了内核文件开机进不去DSTWO系统界面?

       答:1、请先检查拷入的内核是否与你所使用的烧录卡语言版本对应,DSTWO中文版和英文版内核不通用。

       2、重插下TF卡和DSTWO,可能是没插好避免接触不良。

       问:SuperCard DSTWO可以在DSiLL上使用吗?

       答:可以,SuperCard DSTWO可以在所有NDS、NDSL/iDSL、NDSi/idsi、NDSiLL/DSiXL上使用

       问:DSTWO在DSL上使用的之后可以引导slot2端烧录卡吗?

       答:可以,在dstwo系统菜单上有引导slot2端烧录卡的选项。

       问:DSTWO可以使用烧录卡自制工具吗?

       答:可以,例如moonshell、colors 这些都可以再DSTWO上正常使用

       问:SuperCard DSTWO最大支持很大容量的TF卡?

       答:DSTWO支持SDHC规格最大容量,目前已测试使用过的最大容量为GB

       问:SuperCard DSTWO系统语言只有中、英文吗?

       答:SuperCard DSTWO支持英、简体中文、繁体日文、法、意、日、等七国语言dstwo烧录卡金手指,可自由切换。同时,SuperCard DSTWO的系统语言包制作简洁便利,完全可以满足其它语种使用人群的规定

       问:DSTWO可以使用这些金手指文件?放在哪个地方?

       答:dat格式,将金手指文件usrcheat.dat放到 _dstwo文件夹下.

       问:我能用原来旧产品的存档吗?

       答:可以,只要您把存档文件拷贝游戏命同目录下,并且改存档名和游戏名同样即可。

       问:即时存档如何使用?

       答:在游戏中按热键(默认为L+R+start)呼出功能菜单,选择“即时存档”,DSTWO即时存档支持添加注解描述。

       问:即时攻略如何使用?

       答:将有攻略内容的txt文本放入tf卡,与游戏同目录以及命名同样。在游戏中按热键(默认为L+R+start)呼出功能菜单,社团管理管理源码选择“即时攻略”。

       问:多个即时攻略文件怎么使用?

       答:格式如下:游戏名同样.1.txt,游戏名相同.2.txt,游戏名同样.3.bmp,这样即时攻略都会列出与游戏名同样的所有文本或截图攻略。

       问:即时攻略支持哪些文本格式?

       答:支持txt格式的文本文件。

       问:即时照片攻略支持哪些格式的文件?

       答:支持BMP格式文件

       问:为什么即时照片攻略不能读取我放置的BMP?

       答:请将该照片转换BMP 位格式后再放到,同时请确认命名与游戏名同样。

       问:什么是“DS游侠”?

       答:这是DSTWO超级软件平台上独有的强大功能,利用这一功能,玩家能自已查找出网游主角的生命值,金钱等参数,并可以设置和锁定。这个功能在没我金手指发布的之后十分实用。总体来说就象手机上的“金山游侠”一样。

       问:“DS游侠”能查找出没有具体数字的生命值吗,比如:格斗游戏的血槽?

       答:能,只要用“DS游侠”的“模糊查找”功能就行了。

       问:我想和家人玩同一个游戏,可以分开使用存档吗?

       答:可以,在开启游戏前,在游戏界面上按“x”键,将“多存档”中的默认“0”改为其它数字即可,DSTWO有4组默认存档位可以使用。

       问:DSTWO能模拟GBA,还能模拟其他游戏机吗?

       答:能,因为这都是基于DSTWO强大的CPU运算能力研发的。比如说:SNES,街机模拟器等。

       问:玩GBA游戏时游戏rom放那里,要特定的文件夹吗?

       答:放在自己能找得到的地方就行了~

       问:玩GBA游戏时游戏机很快就没电了,是否正常?

       答:3~4小时属于正常,运行GBA游戏时功耗非常大。

       问:我在游戏中存档了,第二次进去如何没有了?

       答:GBA模拟器如果必须是在游戏中存档(.sav),需要点“退出模拟器”才可生效。

       问:能否在DSTWO上看电子书?

       答:能

       问:DSTWO EOS的DLDI补丁在哪里?

       答:这是DSTWO DLDI文件,请单击下载 dstwo_dldi.zip

       问:如何使用DSTWO复位功能让自制程序回到桌面?

       答:请下载这个例子,它可以实现自制工具回到DSTWO桌面。请下载 dstwo_reset_sample.zip

       硬件区别/DSTWO

       独立CPU:独立的CPU相对于特色的方案而言,DSTWO的构架较先进升级和反烧录功能更灵活反烧录功能更强,传统的卡反烧录由NDS完成,而DSTWO是由自己CPU完成,这个CPU的主频有m 比NDS快这些 。

       独立显存:介于CPU的睿频较高故此DSTWO也采用了对应的存储芯片,这和PC,手机一个道理。内存不仅用于日常的高速缓存之外,还主要用于提高反烧录以及实时存档,以及可以处理更多数据,像DS游侠这种没有大内存能够实现,因为要把NDS主机的RAM全部导出来,跑模拟器更需要强大的CPU和内存 。

       SDK开发/DSTWO

       1ds2sdk是大漠范围移动源码哪个?

       DSTWO SDK

       ds2sdk是应用层和驱动层的一个接口。它是GCC编译器,ds2硬件驱动

       库,一些开源库和一个例子的集合。它被发行的目的是为了帮助程序爱好者开发能在DSTWO上运行的程序。

       2ds2sdk可以拿来做哪些?

       ds2sdk可以看作是一个多媒体开发工具包。硬件层主要提供音频和视频存储功能,通过ds2sdk上层接口,你可以将音频数据和视频数据传送到NDS,同样dstwo烧录卡金手指,你可以把NDS的软件信息和即时时钟信息返回给上层应用程序。所以,利用ds2sdk,如果你是一个程序爱好者,凡是与音频、视频相关事情,你都可以尝试去做。比如,你可以在里面开发以及移植自己的阅读工具,或者你认为官方的iReader有哪些可以修改的地方,你乐意的话也可以自己更改(目前最新版的iReader源码也已经全面对外公布)。你可以移植、改进相关的模拟器,或者做自己的自制工具,比如MP3播放器,MPLAYER播放器,你或者可以做自己的小游戏。总之,只要你是一个软件爱好者, ds2sdk就有你施展的表演。

       3如何使用ds2sdk?

       为了使用ds2sdk,你应该做下面几件事情:

       ( 1 ) 建立研发环境,包括linux环境和交叉编译环境。

       ( 2 ) 你的程序中需要有应用程序入口: ds2_main(), 就像通常程序中的main函数一样。

       ( 3 ) 初始化相关软硬件(包括视频、音频和其他输入输出设备等待):由函数ds2io_init()或者函数ds2io_initb()完成。

       ( 4 ) 初始化控制台:由变量ConsoleInit()完成。

       ( 5 ) 初始化文件系统:由变量fat_init()完成。此文件系统只能读写DSTWO上的SD卡。

       ( 6 ) 进入用户主程序,至此,控制权交给用户应用程序。

       示例,具体可以参照ds2sdk的example:

视频和视频帧:FFMPEG+Intel QSV硬解的环境安装篇

       在进行视频处理项目时,需要集成FFMPEG的QSV插件以利用Intel的集成GPU(核显)进行高效视频解码。本文将详细介绍在Linux环境下如何编译和安装QSV插件,包括Intel的libva、media-driver和msdk源码编译方法,以及如何成功集成到FFMPEG源码中。以下步骤将帮助你搭建起硬解环境,提升视频处理性能。

       FFMPEG作为多媒体文件处理的强大工具,不仅支持CPU处理(软解),还能够利用各种GPU卡进行硬件加速(硬解),包括Intel的集成显卡、NVIDIA的N卡以及ARM的A卡。本文专注于介绍如何在Linux环境下集成FFMPEG的QSV插件。

       首先,确保环境配置满足要求,包括GCC/G++版本4.9及以上、CMAKE版本3.6及以上。选择/opt作为库的编译安装路径。Intel官方提供了QSV插件的各个组件之间的关系图,这有助于在安装前对整个QSV框架有初步的认知。

       安装前的准备工作包括安装gcc和cmake,检查内核版本确保不低于4..,或根据需要更新内核版本。在执行cmake --version时,可能遇到“bash: /usr/bin/cmake: No such file or directory”的错误,解决方法是将cmake安装路径从/usr/local/bin复制到/usr/bin下。

       接下来,进行libva和media-driver的编译安装。libva和libva-utils安装在/opt/intel下,确保在编译时设置PKG_CONFIG_PATH为/opt/intel/libva/lib/pkgconfig,以解决libva-utils的依赖问题。media-driver安装后,显示结果应包含成功安装的组件。

       在完成libva和media-driver的安装后,接下来是Intel Media SDK(MSDK)的源码编译。MSDK安装后,库文件位于默认路径下的/opt/intel/mediasdk目录。确保在动态链接库中添加该路径,并通过运行msdk编译后的可执行程序sample_xxx进行测试,验证安装是否成功。

       最后,自定义编译FFMPEG源码以集成QSV插件。由于默认安装的FFMPEG不支持QSV选项,需要手动编译。确保在编译FFMPEG时,环境变量正确指向libmfx.pc文件,以确保QSV插件被正确识别。通过运行自定义编译的FFMPEG可执行文件进行测试,验证集成是否成功。

       本文通过详细步骤和注意事项,旨在帮助开发者高效搭建FFMPEG+QSV的环境,利用Intel的集成GPU进行视频解码加速。通过遵循上述指南,开发者可以避免一些常见错误,并顺利完成集成过程。希望本文内容能为视频处理项目的开发者提供实用的指导,提升视频处理效率。

Linux应用开发第八章ALSA应用开发

       音频信号是一种连续变化的模拟信号,但计算机只能处理和记录二进制的数字信号,由自然音源得到的音频信号必须经过一定的变换,成为数字音频信号之后,才能送到计算机中作进一步的处理。

       数字音频系统通过将声波的波型转换成一系列二进制数据,来实现对原始声音的重现,实现这一步骤的设备常被称为(A/D)。A/D转换器以每秒钟上万次的速率对声波进行采样,每个采样点都记录下了原始模拟声波在某一时刻的状态,通常称之为样本(sample),而每一秒钟所采样的数目则称为采样频率,通过将一串连续的样本连接起来,就可以在计算机中描述一段声音了。对于采样过程中的每一个样本来说,数字音频系统会分配一定存储位来记录声波的振幅,一般称之为采样分辨率或者采样精度,采样精度越高,声音还原时就会越细腻。

       数字音频涉及到的概念非常多,对于在Linux下进行音频编程的程序员来说,最重要的是解声音数字化的两个关键步骤:采样和量化。

       采样频率是指将模拟声音波形进行数字化时,每秒钟抽取声波幅度样本的次数。采样频率的选择应该遵循奈奎斯特(Harry Nyquist)采样理论:如果对某一模拟信号进行采样,则采样后可还原的最高信号频率只有采样频率的一半,或者说只要采样频率高于输入信号最高频率的两倍,就能从采样信号系列重构原始信号。

       量化位数是对模拟音频信号的幅度进行数字化,它决定了模拟信号数字化以后的动态范围,常用的有8位、位和位。量化位越高,信号的动态范围越大,数字化后的音频信号就越可能接近原始信号,但所需要的存储空间也越大。

       ALSA全称是Advanced Linux Sound Architecture,中文音译是Linux高级声音体系。ALSA是Linux内核2.6后续版本中支持音频系统的标准接口程序,由ALSA库、内核驱动和相关测试开发工具组成,更好的管理Linux中音频系统。

       本小节将介绍ALSA的架构。

       ALSA是Linux系统中为声卡提供驱动的内核组件。它提供了专门的库函数来简化相应应用程序的编写。相较于OSS的编程接口,ALSA的函数库更加便于使用。

       对应用程序而言,ALSA无疑是一个更佳的选择,因为它具有更加友好的编程接口,并且完全兼容于OSS。

       ALSA系统包括7个子项目:

       ALSA声卡驱动与用户空间体系结构交互如下图所示:

       移植ALSA主要是移植alsa-Ub和alsa-utils。

       ALSA Util是纯应用层的软件,相当于ALSA设备的测试程序,ALSA-Lib则是支持应用API的中间层程序,ALSA-Util中的应用程序中会调用到ALSA-Lib中的接口来操作到我们的音频编解码芯片的寄存器,而lib中接口就是依赖于最底层驱动代码,因此移植ALSA程序的顺序就是先后移植Driver,Lib,Util。

       ALSA首先需要在ALSA的官网上下载官网 alsa-project.org下载alsa-lib和alsa-utils。

       ALSA Lib移植不需要修改源码,只需要重新编译库代码以支持自己的平台。

       在上述命令中./configure配置的几个重要的配置选项解释如下:

       ALSA Util可以生成用于播放,录制,配置音频的应用可执行文件,测试驱动代码时用处很大,编译过程如下:

       ALSA库和测试工具的移植就是将相应库文件和可执行文件放在目标板上,以下文件必须被拷贝至对应位置:

       (1)ALSA Lib文件,放在/lib/中。

       (2)配置文件放在/usr/local/share中,与编译时指定的目录相同。

       (3)测试应用文件,ALSA Util能产生aplay、amixer、arecord,我们可以把这些可执行文件放在/usr/sbin中。

       (4)内核目录中保证有/dev/snd/目录,这个目录下存放controlC0,pcmC0D0,/usr/sbintimer,timer这些设备文件,如果这些设备文件已经在/dev目录下,可手动拷贝到/snd目录中。

       在LINUX系统中,每个设备文件都是文件。音频设备也是一样,它的设备文件被放在/dev/snd目录下,我们来看下这些设备文件:

       (1)controlC0:音频控制设备文件,例如通道选择,混音,麦克风的控制等;

       (2)pcmC0D0c:声卡0设备0的录音设备,c表示capter;

       (3)pcmC0D0p:声卡0设备0的播音设备,p表示play;

       (4)timer:定时器设置。

       本小节将着重讲解tinyalsa工具使用,tinyalsa是alsa-lib的一个简化版。它提供了pcm和control的基本接口;没有太多太复杂的操作、功能。可以按需使用接口。

       使用方法:

       举例:

       与amixer作用类似,用于操作mixer control。

       使用方法:

       举例:

       aplay是命令行的ALSA声卡驱动的播放工具,用于播放功能。使用方法:

       举例:

       arecord是命令行的ALSA声卡驱动的录音工具,用于录音功能。使用方法:

       举例:

       从代码角度体现了alsa-lib和alsa-driver及hardwared的交互关系。用户层的alsa-lib通过操作alsa-driver创建的设备文件/dev/snd/pcmC0D0p等对内核层进行访问。内核层的alsa-drivier驱动再经由sound core对硬件声卡芯片进行访问。

       为了方便操作访问,alsa-lib中封装了相关接口,通过pcmCXDXp/pcmCXDXc节点(/dev/snd/pcmCXDXx)去实现播放、录音功能。

       主要涉及到的接口:

       详细pcm接口说明请查阅:

       alsa-project.org/alsa-d...

FFmpeg读取Assets资源文件

       在Android开发中,我们经常将原生资源文件放置于assets目录下,以便在需要时进行读取。通过API提供的resources.assets.open(filename)/openFd(filenam)方法,可以方便地获得InputStream或FileDescriptor。然而,在使用FFmpeg读取assets资源文件时,遇到了难以克服的困难。主要问题是,FFmpeg在读取媒体文件时通过传入的URL来判断IO协议,因此,为了使FFmpeg正确读取assets文件,我们需要选择合适的IO协议构造URL并传入avformat_open_input(...)方法,但实际上操作起来似乎问题重重。

       AssetFileDescriptor提供了资源文件的有效文件标识符。是否可以通过此fd来打开媒体文件?答案是肯定的。然而,assets返回的AssetFileDescriptor带有mStartOffset,这意味着实际的有效数据需要从mStartOffset处开始读取。

       在Stackoverflow上,有人提出了类似的问题:如何通过AssetFileDescriptor正确地将assets文件传递给FFmpeg使用JNI在Android中。实现方式是在调用avformat_open_input(...)方法之前手动创建AVFormatContext并设置skip_initial_bytes参数。

       在使用上述方法时,发现无法正常解码mp4(mov格式)视频文件,Stackoverflow上也有类似的反馈。尽管解码失败,但可以获取视频文件的基本信息。查看FFmpeg的日志后,发现FFmpeg在解析mp4文件信息时并未出错,正确识别了ftyp、mdat、moov等关键atom,但在后续解析中正常解析了sample与chunk的映射关系(stsc),但在解码阶段报出明显的Invalid NAL unit size异常。

       分析表明,assets目录下的媒体文件可能被Android进行了特殊处理。然而,从AssetFileDescriptor的官方描述中可以得知,Android并没有对assets下的文件进行特殊处理。在Android音视频开发中,我们经常使用MediaCodec的setDataSource(fd)方法传递媒体数据,MediaCodec仍然可以正常读取assets资源文件,这引发了一个疑问:在使用Android的AssetFileDescriptor时是否需要特殊的处理?MediaCodec是如何处理AssetFileDescriptor的?

       搜索源码后发现,MediaExtractor#setDataSource所调用的native方法为NuMediaExtractor::setDataSource,该方法最终将fd封装为FileSource对象。FileSource中读取数据的操作使用了普通的linux内核函数read,这一过程并没有对fd做任何特殊的处理。

       在FFmpeg中,文件协议处理在libavformat/file.c中。比较FFmpeg与MediaCodec处理AssetFileDescriptor的逻辑,两者都使用了read函数,不同的是file_read函数中并没有seek相关的逻辑。这说明libavformat/file.c中封装的是基础的IO操作,并未包含其他无关逻辑。FFmpeg将所有的IO协议封装为URLProtocl结构体。在mov格式中的定义为:

       FFmpeg与MediaCodec在读取AssetFileDescriptor时都使用了read函数,但暂时无法确定FFmpeg内部seek的逻辑是否存在问题。怀疑FFmpeg可能没有正确处理AssetFileDescriptor的startOffset。测试AVFormatContext中的skip_initial_bytes是否存在问题。

       在Android应用层和Native层进行了相关测试,正常解码。应用层调用与上述相同,Native层需要设置skip_initial_bytes变量。测试结果:不能正常解码,可以获取媒体文件基本信息,日志与上述“问题”中的日志相同。这表明FFmpeg在处理mp4(mov格式)文件时,如果设置了AVFormatContext的skip_initial_bytes变量,FFmpeg将不能正确读取和解码文件。

       原因在于,在调用重要函数init_input之后,avformat_open_input将文件seek到了指定的offset位置,但并没有进行其余处理逻辑。随后,avformat_open_input将调用AVInputformat中的read_header函数指针,该指针指向对应文件格式的函数,在mov格式中的read_header函数为mov_read_header。mov_read_header函数中,FFmpeg将根据read_header解析到的位置重新seek,导致从av_read_frame获得的AVPacket中的数据是错误的数据,因此给到编码器也无法正常解码。

       解决方案相对简单,因为mov.c解析atom时只传递了AVIOContext,因此在AVIOContext中添加了同样的skip_initial_bytes字段。在调用mov_build_index并在AVIndexEntry(采样映射关系的结构体)赋值pos时加上相应的skip_initial_bytes。这种方案已被提交到Github,并详细说明了修改的文件。基于WhatTheCodec工程编写的新demo经过测试,并没有发现其他问题。如有其他问题,欢迎交流并互相学习。

       在上述Stackoverflow的提问中,有提到使用pipe协议,实际上这种方式也是可行的。但在实现过程中,发现了一些需要注意的问题。为了更具有通用性,在Native层手动创建了pipe,并将pipe的输出端fd给到FFmpeg,输入端fd由应用层持有并在IO线程中写入数据。这样,我们便可以利用pipe协议灵活地写入数据,甚至可以把内存中的视频数据直接传入FFmpeg中。

       总结本文,分析了使用AssetFileDescriptor向FFmpeg传递数据时遇到的问题,这一问题实际上是由于FFmpeg在解析mov格式文件时未能正确处理skip_initial_bytes所致。分享了在使用pipe协议时遇到的问题与解决方案。这两个问题的解决可能会大大方便FFmpeg在Android上的使用。虽然MediaCodec在音视频开发的部分场景中已经渐渐取代了FFmpeg,但FFmpeg的通用性、稳定性和兼容性使之仍然可能在未来的Android音视频开发中长期存在。