Объединение видео и аудио -потоков с использованием библиотек FFMPEG в JNI - вывод видео BlackAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Объединение видео и аудио -потоков с использованием библиотек FFMPEG в JNI - вывод видео Black

Сообщение Anonymous »

Я пытаюсь объединить видеофайл и аудиофайл в один MP4, используя библиотеки FFMPEG (LibavFormat, LibavCodec, Libavutil и т. Д.) С помощью JNI на Android. < /p>
У меня уже загружены библиотеки. Вот упрощенный подход, который я использую: < /p>

Код: Выделить всё

const char *videoPath = (*env)->GetStringUTFChars(env, jVideoPath, 0);
const char *audioPath = (*env)->GetStringUTFChars(env, jAudioPath, 0);
const char *outPath   = (*env)->GetStringUTFChars(env, jOutPath, 0);

avformat_network_init();

AVFormatContext *videoFmtCtx = NULL;
AVFormatContext *audioFmtCtx = NULL;
AVFormatContext *outFmtCtx = NULL;

LOGD("Opening video file: %s", videoPath);
LOGD("Opening audio file: %s", audioPath);
LOGD("Output path: %s", outPath);

if (avformat_open_input(&videoFmtCtx, videoPath, NULL, NULL) < 0) return -1;
if (avformat_open_input(&audioFmtCtx, audioPath, NULL, NULL) < 0) return -2;

if (avformat_alloc_output_context2(&outFmtCtx, NULL, NULL, outPath) < 0) return -3;

AVStream *inVideo = videoFmtCtx->streams[0];
AVStream *outVideo = avformat_new_stream(outFmtCtx, NULL);
avcodec_parameters_copy(outVideo->codecpar, inVideo->codecpar);
outVideo->time_base = inVideo->time_base;

AVStream *inAudio = audioFmtCtx->streams[0];
AVStream *outAudio = avformat_new_stream(outFmtCtx, NULL);
avcodec_parameters_copy(outAudio->codecpar, inAudio->codecpar);
outAudio->time_base = inAudio->time_base;

if (!(outFmtCtx->oformat->flags & AVFMT_NOFILE)) {
if (avio_open(&outFmtCtx->pb, outPath, AVIO_FLAG_WRITE) < 0) return -4;
}

if (avformat_write_header(outFmtCtx, NULL) < 0) return -5;

AVPacket pkt;
int videoDone = 0, audioDone = 0;

while (!videoDone || !audioDone) {
int videoRead = 0, audioRead = 0;

if (!videoDone && av_read_frame(videoFmtCtx, &pkt) >= 0) {
pkt.stream_index = outVideo->index;
av_packet_rescale_ts(&pkt, inVideo->time_base, outVideo->time_base);
if (av_interleaved_write_frame(outFmtCtx, &pkt) < 0) {
LOGE("Failed to write video packet");
}
av_packet_unref(&pkt);
videoRead = 1;
} else {
videoDone = 1;
}

if (!audioDone && av_read_frame(audioFmtCtx, &pkt) >= 0) {
pkt.stream_index = outAudio->index;
av_packet_rescale_ts(&pkt, inAudio->time_base, outAudio->time_base);
if (av_interleaved_write_frame(outFmtCtx, &pkt) < 0) {
LOGE("Failed to write audio packet");
}
av_packet_unref(&pkt);
audioRead = 1;
} else {
audioDone = 1;
}

// if both streams have no packets left, exit
if (!videoRead && !audioRead) break;
}

av_write_trailer(outFmtCtx);

avformat_close_input(&videoFmtCtx);
avformat_close_input(&audioFmtCtx);
if (!(outFmtCtx->oformat->flags & AVFMT_NOFILE)) avio_closep(&outFmtCtx->pb);
avformat_free_context(outFmtCtx);

(*env)->ReleaseStringUTFChars(env, jVideoPath, videoPath);
(*env)->ReleaseStringUTFChars(env, jAudioPath, audioPath);
(*env)->ReleaseStringUTFChars(env, jOutPath, outPath);

LOGD("mergeAV finished successfully");
return 0;
Проблема:
Обключенный файл правильно воспроизводит звук, но видео -черное. Библиотеки напрямую. < /p>
Вопрос:
Что такое правильный способ объединения видео + аудиотоки непосредственно с библиотеками ffmpeg (avformat /avcodec) в JNI, чтобы результируемый MP4 воспроизводится как с видео, так и с аудио? загружен < /p>
правильно открываемые входные форматы и выделенный выходной контекст < /p>
потоки, скопированные с помощью AVCODEC_PARAMETERS_COPY < /p>
Я не использую командную линию ffmpeg, я хочу делать это чисто. РАСПРАВЛЕНИЕ, ПРИВЕТСТВЕННАЯ ПЕРЕДЕЛА>

Подробнее здесь: https://stackoverflow.com/questions/797 ... -video-bla
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»