android硬件加速

DXVA是视频硬件加速的统称,不仅仅是视频数据解码(包括H261,MPEG1,MPEG2,H263,MPEG4), 还有Alpha blending, Picture resampling等。但对于播放时CPU利用率影响最大的,则是视频解码,尤其是HDTV的解码。对于低端系统来说,让GPU来负责硬件解码是不二之选。但使用硬件解码,在整个功能上也受到很多限制,尤其是解压以后的视频数据的后期处理(如deinterlace,锐化,去马赛克). 因此对于追求画质的烧友,宁可放弃硬件解码,当然代价是需要升级整个系统。稍后再谈。


硬件解码生效的时候,系统是怎么运转的呢?现在我们有两个处理器,CPU和GPU。他们通过PCI/AGP/PCIE总线交换数据。
1。CPU从文件系统里读出原始数据(DirectSHow的源滤镜),分离出压缩的视频数据(分离器)。放在系统内存中。 GPU 发呆
2。CPU把压缩视频数据交给GPU, 这时总线上开始忙了,压缩数据从系统内存拷贝到显卡上的显存里。
3. CPU要求 GPU开始硬件解码,现在 CPU进入发呆期,GPU开始忙。当然CPU会定期查询一下GPU忙的怎么样了。
4。GPU开始用自己的电路解码视频数据(已经在显存里了),解压后的数据还是放在显存里面。CPU继续发呆。
5. 视频数据刚解码完成以后还不能立刻拿去显示,因为还需要后期处理,如deinterlace, 3:2pulldown,等等。GPU再用自己的后期处理电路来进行处理。CPU还是发呆
6。后期处理以后的未压缩数据拿去显示到屏幕上, GPU再开始忙视频的缩放,亮度,gamma等事情。CPU还是闲
7. GPU终于忙完了,下面的视频数据在哪里?通知CPU,GPU先歇会。 CPU又开始忙了,回到第1步。

上面可以看到,硬件解码生效的时候,CPU真的可以很闲,但是为了让它生效,有些条件必须满足。最关键的原因是,与CPu->系统内存和GPU->显卡显存比起来,PCI、AGP、PCIE总线是龟速。PCI是133MB/S, AGP8X是2.1GB/S, PCIE16X是4GB/S, 而CPU-系统内存,GPU-显存则快若干倍。有兴趣的可以把不同时代的内存总线和AGP/PCIE总线速度进行一下对比。因为CPU和GPU互连的总线很慢,因此,视频数据(无论是解压前还是解压后)一旦交给GPU,GPU就要负责把它处理完,直到最终显示。
如果在前面1-5步里有哪一步GPU不能做或你不让它做,视频硬件解码就不生效,CPU要负责。
当然,你可能会问,也许CPU很慢,说不定在龟速总线上传输数据,GPU分担一部分工作,还是比全部CPU做要快呢? 也许如此,但在Directshow架构里,代表视频数据处理各环节的滤镜(分离器,解码器,后期处理,渲染器)需要协商出一个大家都接受的视频数据存储方式,如果某个滤镜说我只能在系统内存里玩,大家都得要在内存里玩,GPU和显存只好放弃。

了解了这样的步骤,我们看什么时候硬件解码会失败。
1. GPU自己没办法独立搞定解码,比如太老的显卡,显存太少,或者象GF2MX,GF4TI这种太监(MC和IDCT只支持一个)。注:这里有错误!!!
2. GPU的视频后期处理太差劲,你要找其他软件来做,这个对于发烧友是很常见的情况,比如放DVD加ffdshow锐化倍线。ffdshow只能在系统内存里工作,它没办法把手伸到显卡显存上,那么硬件解码只好让位给软件解码。
3。非常常见的一个情况,就是用vobsub加字幕。vobsub滤镜是加在解码器之后,渲染器之前的。它怎么把字幕放到图像上去? 原始图像进来,它修改原始图像,把字幕的图案画上去,再送给后面的渲染器(或者别的后期处理滤镜)。 vobsub同样只能在系统内存里工作,ok, 解码也要软件了。
vobsub不能用,那字幕要怎么加?所幸渲染器提供了混合模式,就是把几种视频数据揉在一起,这些数据可以是在系统内存中(软件解码或软件生成),也可以是在显卡显存中(硬件解码)。最大的好处是各种视频数据可以独立生成,不会互相牵制。可以硬件解压的用硬件解压,可以软件生存的用软件生存。(类似电路里串联和并联的关系)、 哪些软件呢?比如MPC, KMP, BSPlayer, 他们自带字幕引擎。而ZoomPlayer借助于vobsub生成字幕。只能用软解压。

Media Player Classic(MPC),不要把它和暴风影音等套件混起来。MPC是一个播放器内带了一些滤镜和字幕工具,全部是Gabest这个牛人开发的Opensource软件,暴风里除了MPC以外还有一堆其他公司的滤镜,包括vobsub, 理论上可能有版权问题。vobsub虽然也是gabest开发的,但它显示字幕的工作方式和MPC里的不同。vobsub在视频数据交给渲染器之前插入字幕, MPC把视频数据和字幕分开,一起交给渲染器。 如果套件里包涵vobsub, 建议删除之,我不确定禁用vobsub的效果如何。【alban911确认,禁用vobsub没有问题】

KMP也是一个较常用的播放器,值得主要的是,除了自带字幕引擎以外,它内部自带了一个视频后期处理引擎,如果选画质模式等,这个引擎会生效。同样道理,这个引擎只能在系统内存里玩,那么硬件解码只能放弃。必须要选择极速/高速模式,禁用这个引擎,或者在系统选项里明确禁用此引擎,才能允许硬件解码工作。



最后回到主题,低端系统要放HDTV流畅,多半需要借助于显卡硬件解压。几个注意事项
1. 视频格式要mpeg2,显卡GPU才能协助解压 (WMV目前没有硬件解压方案)。【注:2005年5月微软终于放出了WMV硬件解码补丁,但对显卡和系统要求颇高,且不少中低端系统上效果不明显甚至更差】
2。显卡及驱动要支持mpeg2硬件解压。
3。视频解码器要能把mpeg2解压工作分担给显卡
4。视频渲染器要用overlay,不要用VMR
5. 字幕要用播放器自带的,绝对不能用vobsub。 不用字幕最好啦。
6. 不能用ffdshow, nvvpp等软件视频后期处理,要用显卡里自带的后期视频处理(虽然可能烂了点)。
7。KMP必须用极速、高速模式
8。硬件方面,最好不要用多头显示(overlay对多头显示支持不好,VMR支持好但开销大)。如果需要多头显示,再加上很多人依赖的字幕,你可能被迫使用软解压或VMR
9. 硬件方面,PCI显卡因为是诸多设备共享PCI总线,带宽也只有133MB/S,尽可能不要用(虽然压缩视频数据流一般也就是10-20MbpS). AGP是独享且至少是266MB/S(AGP1X),但有可能的话还是应该优化一下,比如打开FastWrite, SideBandAddessing什么的,只要系统稳定。PCIE? 低端系统会有PCIE吗?
如果你不确定现有的配置是否能够使用硬件解码,建议在调整的时候使用NVIDIA decoder, 它可以明确指示是否工作于硬件解码方式下。调整好了,你可以再改回你喜欢的硬件解码器,如sonic, cyberlink等。

还有一点很重要的,就是强烈不建议用大杂烩似的解码器包比如暴风影音等,里面很多的滤镜会把directshow架构弄得非常复杂,如果你不确定某个滤镜的作用而安装了,可能会严重干扰你的系统。建议重新安装windows系统,然后只安装你需要的播放器和滤镜。
DXVA是接口规范,显卡硬件支持DXVA规范,不代表就实现了里面所有的功能,但是肯定的一点是,无论什么功能,显卡驱动的DXVA部分代码一定会告诉应用程序,这项功能它实现了还是没有实现,这是DXVA规范强制性要求的。好处是应用程序不需要自己花费时间和精力去测试显卡有没有实现这项功能。
解码器支持DXVA规范,不代表就能利用DXVA规范里面所有的功能组合,它可以选择自己有能力支持的,或者想要支持的那些功能组合,其他功能组合也许就放弃了。还有,某显卡虽然表示支持某种能力,但如果解码器认为这个能力的支持不够稳定,容易导致系统崩溃或错误,它也可以放弃这种能力。

按照DXVA规范,硬件解码加速有3种级别
MC 加速
IDCT加速(含MC)
VLD加速(含MC+IDCT)

硬件支持任何一种组合都算得上是DXVA硬件加速。即便连MC都不支持,只要老老实实交待,也算符合DXVA规范。

绝大多数显卡都支持IDCT加速。少数显卡能支持VLD(比如S3), 少数显卡只能支持MC(如NVIDIA老卡)
同时支持几个不同的加速模式,工作量不小。解码器开发的时候如果考虑到投入产出比,一定会支持IDCT加速,但VLD加速和MC加速可能就会放弃。这也是为什么很多人发现只有在MC+IDCT的显卡上才能开启硬件加速的原因。如果解码器支持MC加速,那么只有MC的显卡也可以使用硬件加速了。NVIDIA PureVideo Decoder肯定可以支持MC加速。

另外,从某些资料里,GF4TI显卡硬件声称支持IDCT, 但硬件支持此功能不见得就代表这个功能很容易被应用程序使用(按照DXVA的规范),即便能被使用,不见得驱动程序的实现就非常稳定,让应用程序敢于使用。比如3寸软盘声称能存储数据,但我现在根本不敢用,因为坏的太快了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Android中可以使用FFmpeg进行硬件加速。具体来说,可以通过集成FFmpeg的MediaCodec模块来实现硬件加速。MediaCodec是Android提供的一个用于音视频编解码的API,它可以利用设备的硬件加速功能来提高编解码的性能。 在FFmpeg中,可以使用libavcodec模块的硬件加速功能来调用Android的MediaCodec。通过设置合适的解码器和编码器,可以实现对音视频数据的硬件加速处理。 以下是一个使用FFmpeg进行硬件加速的示例代码: ```c #include <libavcodec/avcodec.h> #include <libavformat/avformat.h> #include <libavutil/avutil.h> #include <libavutil/opt.h> int main() { // 初始化FFmpeg av_register_all(); // 打开输入文件 AVFormatContext *inputFormatContext = NULL; avformat_open_input(&inputFormatContext, "input.mp4", NULL, NULL); avformat_find_stream_info(inputFormatContext, NULL); // 查找视频流 int videoStreamIndex = -1; for (int i = 0; i < inputFormatContext->nb_streams; i++) { if (inputFormatContext->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) { videoStreamIndex = i; break; } } // 获取视频解码器 AVCodec *videoCodec = avcodec_find_decoder(inputFormatContext->streams[videoStreamIndex]->codecpar->codec_id); AVCodecContext *videoCodecContext = avcodec_alloc_context3(videoCodec); avcodec_parameters_to_context(videoCodecContext, inputFormatContext->streams[videoStreamIndex]->codecpar); avcodec_open2(videoCodecContext, videoCodec, NULL); // 创建硬件加速上下文 AVBufferRef *hwDeviceContext = NULL; av_hwdevice_ctx_create(&hwDeviceContext, AV_HWDEVICE_TYPE_MEDIACODEC, NULL, NULL, 0); // 设置解码器的硬件加速上下文 av_opt_set_int(videoCodecContext, "mediacodec", 1, 0); av_opt_set_q(videoCodecContext, "refcounted_frames", 1, 0); av_hwframe_ctx_init(videoCodecContext->hw_frames_ctx, hwDeviceContext); // 解码视频帧 AVPacket packet; while (av_read_frame(inputFormatContext, &packet) >= 0) { if (packet.stream_index == videoStreamIndex) { AVFrame *frame = av_frame_alloc(); avcodec_send_packet(videoCodecContext, &packet); avcodec_receive_frame(videoCodecContext, frame); // 处理解码后的视频帧 av_frame_free(&frame); } av_packet_unref(&packet); } // 释放资源 avformat_close_input(&inputFormatContext); avcodec_free_context(&videoCodecContext); av_buffer_unref(&hwDeviceContext); return 0; } ``` 这段代码使用FFmpeg打开一个视频文件,并通过硬件加速的方式解码视频帧。你可以根据自己的需求对解码后的视频帧进行处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值