Android Video 问题集

屏蔽特定codec

[DESCRIPTION]
由于某些原因,需要屏蔽特定codec,以HEVC为例

[SOLUTION]
1. 直接修改/device/mediatek/ProjectName/media_codecs.xml,将关于HEVC部分的code注释掉;
这种修改方法可能会影响CTS测试;

如果是高通项目需要将****项目上需要将下面的hevc部分注释掉
/****/LINUX/android/device/qcom/msm8994/media_codecs.xml
OMX.qcom.video.encoder.hevc
OMX.qcom.video.decoder.hevc
  1. 通过修改代码的方式,有如下两个方案:
    第一个方案:
    在OMXCodec::findMatchingCodecs()方法中做如下修改:
const char *componentName = info->getCodecName();
//start
if(!strcmp(componentName,"OMX.MTK.VIDEO.DECODER.HEVC")){
ALOGD("findMatchingCodecs OMX.MTK.VIDEO.DECODER.HEVC");
break;
}
//end

在这里如拿到component是OMX.MTK.VIDEO.DECODER.HEVC,直接跳出循环,不赋值;

如果是android O 高通平台则:
MediaCodecList::findMatchingCodecs()方法中修改

AString componentName = info->getCodecName();
//added by  start
if(!strcmp(componentName,"OMX.qcom.video.decoder.hevc")){
ALOGD("findMatchingCodecs OMX.qcom.video.decoder.hevc");
break;
}
//added by  end

如果是还希望用google的Sw解码,上面的”break”改为”continue”;

第二个方案:
第一个文件: 在NuPlayerDecoder.cpp中:
NuPlayer::Decoder::onConfigure()方法中:

mCodec = MediaCodec::CreateByType(mCodecLooper,mime.c_str(),false);

—>>
修改为:

if(strcmp(mime.c_str(),"video/hevc")){
ALOGD("onConfigure mime.c_str(): %s",mime.c_str());
mCodec = MediaCodec::CreateByType(mCodecLooper,mime.c_str(),false);
}

这里是说如果mime是video/hevc, 则不会给mCodec赋值;
这个是用于视频播放的时候;

第二个文件:在StagefrightMetadataRetriever.cpp中:
extractVideoFrameWithCodecFlags()方法中,在创建decoder前,添加如下的code:

//start
cosnt char *mimeType;
bool success = trackMeta->findCString(kKeyMIMEType,&mimeType);
CHECK(success);
if(!strcmp(mimeType,"video/hevc")){
ALOGD("extractVideoFrameWithCodecFlags mimeType is video/hevc");
return NULL;
}
//end

这个是用于获取视频缩略图的时候,上述两个方案都需要自行测试来确认是否可以通过所有的CTS测试。

录像录入按键音

[DESCRIPTION]
录像开始时,点击start按钮会播放提示音,最后录出来的视频会把这个按键音录进去。

[SOLUTION]
分析问题视频:
1、录入的“按键音”并不是录像开始提示音,而是按键时机械结构碰撞产生的声音,这种声音已经相当于是录音时周围环境中的声音,是代码不能控制的部分,暂时没有好的方法解决;

2、录入的“按键音”若的确是录像开始提示音,再从log分析:

2.1、从log中搜”CameraService: playSound(1)”,从附近log可找到如下信息:

03-04 18:27:35.938 727 7394 D CameraService: playSound(1)
03-04 18:27:35.938 727 7394 I MediaPlayerService: [getDuration] [24] getDuration = 543

这段log表示按键音播放,并且时长为543ms,由于按键音播放时间加长,就会被录入视频中。

2.2、请找到按键音资源文件:frameworks\base\data\sounds\effects\VideoRecord.ogg,通过替换修剪的方式,将按键音播放时长修改为合适的值,使不会被录入视频(参考值:381ms);

3、若录入按键音现象是偶现,并且按键音时长的值已经较短,这个可能是因为performance的问题,导致播放按键音超时而被录入视频,需要具体问题具体分析performance差的原因。

L nuplayer播放视频暂停被打断,再回到原播放界面,视频画面全黑

[DESCRIPTION]
L版本视频播放器,播放视频先暂停,然后被其他全屏应用中断(例如来电,锁屏等),退到后台,最后重新回到前台(例如挂断电话,解锁等
),视频画面显示为黑色。

[SOLUTION]
L版本视频播放默认选用的player type是nuplayer,nuplayer机制是在上层调用start后才会创建解码器,做相应的解码动作。

若视频播放器中断前处于暂停状态,重启恢复回来后,上层应用只会调用setdatasource\prepare\seekto接口,不会主动调用start,就不会触发nuplayer start,不会创建解码器,当然视频画面为全黑。

手动再点击播放按钮后,视频画面才能seek到中断前的视频画面。

对比L版本之前,本地视频播放默认选用的是awesomeplayer,awesomeplayer机制是在prepare阶段就创建解码器,支持seek preview,重新恢复回来
,上层调用setdatasource\prepare\seekto接口就可以解析当前seek时间点的视频画面,所以不会有上述问题。

以上行为是Google default设计架构。

关于4K录像的尺寸为3840*2176而不是3840*2160的问题

[DESCRIPTION]
4k分辨率的size一般为3840*2160,但mtk平台下MediaProfiles.cpp的4k分辨率的size为3840*2176,所以4k录像出来的size也是3840*2176。

[SOLUTION]
因为4K录像采用的HEVC编码,而HEVC编码要求录像的size32对齐,即把2160改为2176,size变为3840*2176。

[Gallery][DRM]FL格式的视频播放过程中横竖屏切换时播放界面会黑屏一下.

[DESCRIPTION]
进入图库,打开所有支持格式的视频文件,播放视频时切换横竖屏,FL格式视频播放时横竖屏切换操作,播放界面会黑屏一下.

[SOLUTION]
这是正常行为,原因是:
DRM文件在播放过程中不能被截屏,但是转屏时,则会取消这一保护,可能导致DRM文件被截屏,所以在转屏时,需要置为黑屏。

被非全屏闹钟提示界面打断后,直播视频不能恢复

[DESCRIPTION]

客制化闹钟提示界面时,将全屏闹钟提示界面修改为非全屏,这样在直播视频过程中会弹出非全屏提示框,点击
dissmiss alarm后,直播视频不能继续播放。

[SOLUTION]

请做如下修改:
Packages\apps\gallery2\src\com\android\gallery3d\app\MoviePlayer.java

Private OnAudioFocusChangeListener mAudioFocusChangeListener= new onAudioFocusChangeListener(){
    @Override
    Public void onAudioFocusChange(int focusChange) {
        if (focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT&& !MovieUtils.isLiveStreaming(mVideoType)) {
            mVideoView.pause();
        }
    }
}

如何添加或者取消对于某种媒体文件格式的支持

[DESCRIPTION]
如何添加或者取消对于某种媒体文件格式的支持

[SOLUTION]
一、 添加某些格式
以rmvb格式为例,由于lisence问题,将一个rmvb格式视频文件拷贝到手机的SD卡上,该文件无法显示为视频文件;若有预装第三方apk来支持播放该格式视频,可以按照下面的方法,添加对rmvb格式的支持。

在frameworks\base\media\java\android\media\MediaFile.java中:约270行左右,添加RMVB格式的mimeType:

addFileType("AVI", FILE_TYPE_AVI, "video/avi");
addFileType("MOV", FILE_TYPE_QUICKTIME_VIDEO, "video/quicktime");
addFileType("QT", FILE_TYPE_QUICKTIME_VIDEO, "video/quicktime");
addFileType("RMVB", FILE_TYPE_RMVB, "video/x-pn-realvideo");//**添加RMVB**

然后编译framework/base模块,将生成的framework.jar和secondary-framework.jar给push到手机中,然后重启手机:

adb push framework.jar system/framework
adb push secondary-framework.jar system/framework
adb reboot

二、 取消某种格式

以WMA/WMV格式为例,若贵司希望取消对于该种格式的支持,可以按下面步骤修改:

第一步 该种格式的mime type原本为video\audio改为未知
修改frameworks\base\media\java\android\media\MediaFile.java

//addFileType(“WMV”, FILE_TYPE_WMV, “video/x-ms-wmv” ,MtpConstants.FORMAT_WMV);
//addFileType(“ASF”, FILE_TYPE_ASF, “video/x-ms-asf”);
//addFileType("WMA", FILE_TYPE_WMA, "audio/x-ms-wma",MtpConstants.FORMAT_WMA);

若希望彻底去掉对应的video codec,可继续第二、三步。

第二步

ProjectConfig.mk中ASF、wmv、wma的宏值设置为no

第三步
修改media_codecs.xml文件
\config\common\media_codecs.xml
\config\Platform Name\media_codec.xml
去掉:

<MediaCodec name=”OMX.MTK.VIDEO.DECODER.VC1” type=”video/x-ms-wmv”>
<MediaCodec name="OMX.MTK.AUDIO.DECODER.WMA" type="audio/x-ms-wma" />
或者
<MediaCodec name=”OMX.qcom.video.decoder.vc1” type=”video/x-ms-wmv”>
<MediaCodec name="OMX.qcom.video.decoder.wma" type="audio/x-ms-wma" /> 

录像的视频文件最大只有2GB,如果录制更大的视频文件?

[DESCRIPTION]
比较早的时候由于Linux是32位的,最高位做符号位,所以单个文件的大小只能到2GB大小。正是因为如此,MPEG4Writer模块这边就一直使用32-Bit Offset,所以文件大小也就限制到2GB了。

若文件系统可以支持单个文件超过2GB的话,则按下面的方法进行修改。

[SOLUTION]

  1. 首先Application需要Set 64bit Offset的属性给Writer.
frameworks/base/media/java/android/media/MediaRecorder.java
public void setVideoEncodingBitRate(int bitRate)
{
...
setParameter("video-param-encoding-bitrate=" + bitRate);
// To revise the 2GB file size limit. 添加下面这一行
setParameter("param-use-64bit-offset=1");
}
  1. MPEG4Writer中的file cache需要修改为64bit.

frameworks/av/include/media/stagefright/MPEG4Writer.h
这个Class MPEG4FileCacheWriter中的Define.

int seek(off_t offset, int refpos);

修改为:

int seek(off64_t offset, int refpos);

frameworks/av/media/libstagefright/MPEG4Writer.cpp

int MPEG4FileCacheWriter::seek(off_t offset,int refpos)

修改为:

int MPEG4FileCacheWriter::seek(off64_t offset,int refpos)
  1. 如果想把录像文件的大小限制在4GB以内的话,还需要进行下面的修改:

frameworks/av/media/libstagefright/MPEG4Writer.cpp

static const int64_t kMax32BitFileSize = 0x007fffffffLL;
=>
static const int64_t kMax32BitFileSize = 0x00ffffffffLL;

把下面这个if (mUse32BitOffset) 条件注释掉就OK了。

status_t MPEG4Writer::start(MetaData *param){
... ...
//if (mUse32BitOffset) {
// Implicit 32 bit file size limit
if (mMaxFileSizeLimitBytes == 0) {
    mMaxFileSizeLimitBytes = kMax32BitFileSize;
}
// If file size is set to be larger than the 32 bit file
// size limit, treat it as an error.
if (mMaxFileSizeLimitBytes > kMax32BitFileSize) {
    ALOGW("32-bit file size limit (%lld bytes) too big. " "It is changed to %lld bytes",mMaxFileSizeLimitBytes, kMax32BitFileSize);
    mMaxFileSizeLimitBytes = kMax32BitFileSize;
}
//}

通话过程中,不能启动视频播放器播放视频

[DESCRIPTION]
在通话过程中,启动视频播放器播放视频的时候,视频的声音会从听筒中发出来。如何修改在通话的时候,限制播放视频文件。

[SOLUTION]

alps\packages\apps\Gallery2\src\com\android\gallery3d\app\MovieActivity.java
1、

import android.telephony.TelephonyManager;
import android.widget.Toast;

2、MovieActivity.onCreate():

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.v(TAG, "onCreate()");
//start
if(isVoiceBusy()){
Toast.makeText(this,"通话过程中,无法播放该视频
",Toast.LENGTH_LONG).show();
finish();
}
//end
...
}

3、添加isVoiceBusy()方法:

private boolean isVoiceBusy(){
TelephonyManager mTelephonyManager = (TelephonyManager)
getSystemService(TELEPHONY_SERVICE);
int mCallState = mTelephonyManager.getCallState();
Log.d(TAG, "isVoiceBusy(): mCallState = " + mCallState);
if (mCallState != 0) {
return true;
}else{
return false;
}
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安德路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值