С месяц я борюсь за то, чтобы безошибочно добавить аудио-файл builds mpegts isomedia, совместимый с Android.Я взял эту библиотеку в C ++ на GitHub и адаптировал метод 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)
, что я пытаюсь сделать, это прочитать AAC_ADTS_data в файле f_in, чтобы добавить пакет TS и вставить в f_out.Я точно знаю, что когда я записываю f_in, данные записываются в f_in без проблем.спасибо за любую ожидаемую поддержку.