您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
7. 完成音频重采样IResample模块的处理功能~1
发布时间:2021-06-11 17:48:59编辑:雪饮阅读()
完成Iresample模块,首先在入口cpp/native-lib.cpp中打开Iresample(初始化):
#include <string>
#include <android/native_window_jni.h>
#include "FFDemux.h"
#include "XLog.h"
#include "FFDecode.h"
#include "XEGL.h"
#include "XShader.h"
#include "IVideoView.h"
#include "GLVideoView.h"
#include "FFResample.h"
class TestObs:public IObserver
{
public:
void Update(XData d)
{
//XLOGI("TestObs Update data size is %d",d.size);
}
};
IVideoView *view = NULL;
extern "C"
JNIEXPORT jstring
JNICALL
Java_com_example_xplay_MainActivity_stringFromJNI(
JNIEnv *env,
jobject /* this */) {
std::string hello = "Hello from C++";
//XLOGI("S begin!");
//XSleep(3000);
//XLOGI("S end!");
//return env->NewStringUTF(hello.c_str());
///////////////////////////////////
///测试用代码
TestObs *tobs = new TestObs();
IDemux *de = new FFDemux();
//de->AddObs(tobs);
de->Open("/sdcard/1080.mp4");
IDecode *vdecode = new FFDecode();
vdecode->Open(de->GetVPara());
IDecode *adecode = new FFDecode();
adecode->Open(de->GetAPara());
de->AddObs(vdecode);
de->AddObs(adecode);
view = new GLVideoView();
vdecode->AddObs(view);
IResample *resample = new FFResample();
resample->Open(de->GetAPara());
adecode->AddObs(resample);
//vdecode->Open();
de->Start();
vdecode->Start();
adecode->Start();
//XSleep(3000);
//de->Stop();
/*for(;;)
{
XData d = de->Read();
XLOGI("Read data size is %d",d.size);
}*/
return env->NewStringUTF(hello.c_str());
}
extern "C"
JNIEXPORT void JNICALL
Java_com_example_xplay_XPlay_InitView(JNIEnv *env, jobject instance, jobject surface) {
// TODO
ANativeWindow *win = ANativeWindow_fromSurface(env,surface);
view->SetRender(win);
//XEGL::Get()->Init(win);
//XShader shader;
//shader.Init();
}
然后需要在cpp/XData.cpp中实现Alloc方法:
这里同样是用老师的v1080.mp4能够成功
#define XPLAY_XDATA_H
enum XDataType
{
AVPACKET_TYPE = 0,
UCHAR_TYPE = 1
};
struct XData
{
int type = 0;
unsigned char *data = 0;
unsigned char *datas[8] = {0};
int size = 0;
bool isAudio = false;
int width = 0;
int height = 0;
bool Alloc(int size,const char *data=0);
void Drop();
};
#endif //XPLAY_XDATA_H
extern "C"{
#include <libavformat/avformat.h>
}
bool XData::Alloc(int size,const char *d)
{
Drop();
type = UCHAR_TYPE;
if(size <=0)return false;
this->data = new unsigned char[size];
if(!this->data) return false;
if(d)
{
memcpy(this->data,d,size);
}
return true;
}
void XData::Drop()
{
if(!data) return;
if(type == AVPACKET_TYPE)
av_packet_free((AVPacket **)&data);
else
delete data;
data = 0;
size = 0;
}
关键字词:IResample