Где я могу найти файл и андроид написать в JNI
Я написал тестовую демонстрацию для ffmpeg, прочитайте flac
файл и декодировать его на новый pcm
файл.
после проделанной работы я не смог найти выходной файл.
поэтому я открываю выходной файл с новым FILE
указатель, и открыть в порядке, кто-нибудь дает какие-либо советы, спасибо.
static int decode_packet(int *got_frame, int cached)
{
int ret = 0;
int decoded = pkt.size;
*got_frame = 0;
if (pkt.stream_index == audio_stream_idx) {
/* decode audio frame */
ret = avcodec_decode_audio4(audio_dec_ctx, frame, got_frame, &pkt);
if (ret < 0) {
LOG("Error decoding audio frame (%s)\n", av_err2str(ret));
return ret;
}
decoded = FFMIN(ret, pkt.size);
if (*got_frame) {
LOG("frame->format: %d", frame->format);
size_t unpadded_linesize = frame->nb_samples * av_get_bytes_per_sample(AV_SAMPLE_FMT_S16/*frame->format*/);
LOG("audio_frame%s n:%d nb_samples:%d pts:%s\n", cached ? "(cached)" : "", audio_frame_count++, frame->nb_samples,
av_ts2timestr(frame->pts, &audio_dec_ctx->time_base));
fwrite(frame->extended_data[0], 1, unpadded_linesize, audio_dst_file);
}
}
if (*got_frame && api_mode == API_MODE_NEW_API_REF_COUNT)
av_frame_unref(frame);
return decoded;
}
// as convient i write the abspath `/storage/emulated/0` which i got by rountine Environment.getExternalStorageDirectory().getAbsolutePath()
const char *src_filename = "/storage/emulated/0/pyghlkn.flac";
const char *audio_dst_filename = "/storage/emulated/0/test.pcm";
FILE *audio_dst_file = NULL;
FILE *audio_dump = NULL;
JNIEXPORT void JNICALL Java_cn_com_longmaster_ffmpeg_encoder
(JNIEnv *, jobject)
{
//......
/* read frames from the file */
while (av_read_frame(fmt_ctx, &pkt) >= 0) {
AVPacket orig_pkt = pkt;
do {
ret = decode_packet(&got_frame, 0);
LOG("write decode_packet... pkt.size: %d ", pkt.size);
if (ret < 0)
break;
pkt.data += ret;
pkt.size -= ret;
} while (pkt.size > 0);
av_free_packet(&orig_pkt);
}
/* flush cached frames */
pkt.data = NULL;
pkt.size = 0;
do {
decode_packet(&got_frame, 1);
LOG("flush cached frames");
} while (got_frame);
if (audio_dump)
{
LOG("default audio_dump ready...");
}
else
{
LOG("default audio_dump not ready...");
}
audio_dump = fopen(audio_dst_filename, "rb");
if (audio_dump) {
LOG("open pcm file ok...");
} else {
LOG("open pcm file fail...");
}
avcodec_close(audio_dec_ctx);
avformat_close_input(&fmt_ctx);
if (audio_dst_file) {
fclose(audio_dst_file);
}
av_frame_free(&frame);
return ;
}
1 ответ
Решение
Вместо жесткого закодированного пути вы должны использовать File dirBase = Environment.getExternalStorageDirectory(); // Root directory of SD card
в Java-части вашего приложения и передать его в вашу C-программу. Этот путь может быть, например, /storage/sdcard
в зависимости от поставщика вашего телефона andorid. Использование функции всегда даст вам правильный путь.