自一个月以来,我一直在努力在没有成功的情况下在Android上添加符合mpegts isomedia的音频文件。我在github上的c ++中使用了这个库,并通过共享库修改了main方法与Java一起使用。
extern "C" JNIEXPORT jint JNICALL Java_com_isomedia_cmd_mpegtscmd_executecopy(JNIEnv *env, jclass cls, std::string *in_file, std::string *out_file )
{
const char* in_file_name = in_file->c_str();
const char* out_file_name = out_file->c_str();
std::cout << "input ts: " << in_file_name << std::endl;
std::cout << "output ts: " << out_file_name << std::endl;
std::ifstream ifile(in_file_name, std::ios::binary | std::ios::in); // declare un flux permettant de lire dans input file
std::ofstream outts(out_file_name, std::ios::binary); // declare un flux pour ecrire dans output file
std::tr1::shared_ptr<MpegTsMuxer> muxer(new MpegTsMuxer);
MpegTsDemuxer demuxer;
char packet[188] = { 0 };
SimpleBuffer in;
SimpleBuffer out;
while (!ifile.eof()) {
ifile.read(packet, 188);
in.append(packet, 188);
TsFrame *frame = 0; //nullptr; You can only use nullptr in Visual Studio 2010 and newer, it is a C++11 feature.
demuxer.decode(&in, frame);
write_file(frame);
if (frame) {
muxer->encode(frame, demuxer.stream_pid_map, &out);
outts.write(out.data(), out.size());
out.erase(out.size());
}
}
ifile.close();
for (auto it = file_map.begin(); it != file_map.end(); it++) {
it->second->close();
}
return 0;
}
在Java中的加载库之后,我调用这样的方法
mpegtscmd.executecopy(f_in.getAbsolutePath(),f_out.getAbsolutePath());
两个文件都在同一目录中创建,但是没有数据填充错误导致程序崩溃
No JNI_OnLoad found in /data/app-lib/ + Fatal signal 11 (SIGSEGV) at 0x2d000005 (code=1)
我想做的是读取f_in文件中的AAC_ADTS_data以添加TS数据包并放入f_out中。我精确地指出,当我仅记录f_in时,数据就可以毫无问题地写入f_in中。感谢您的支持。