FFmpeg: произошла общая ошибка во внешней библиотеке при использовании avcodec_send_frame FFmpeg6.1. ⇐ C++
FFmpeg: произошла общая ошибка во внешней библиотеке при использовании avcodec_send_frame FFmpeg6.1.
У меня есть тот же код, который может успешно передавать потоки (rtmp) в среду, но в среде Android у меня происходит сбой с сообщением об ошибке. Метод сообщения об ошибке — avcodec_send_frame в ffmpeg6.1. Кстати, библиотеку FFmpeg на Android я собирал сам, а для Win11 скачал официальный пакет. Ниже я предоставлю код для Android и Win11.
андроид:
static void encode(AVCodecContext *enc_ctx, AVFrame *frame, AVPacket *pkt, AVFormatContext *outFormatCtx) { интервал врет; /* отправляем кадр в кодер */ если (кадр) LOGE2("Отправить кадр %ld\n",frame->pts); ret = avcodec_send_frame(enc_ctx,frame); если (рет < 0) { char errbuf[AV_ERROR_MAX_STRING_SIZE]; av_strerror(ret, errbuf, AV_ERROR_MAX_STRING_SIZE); LOGE2("Ошибка отправки кадра на кодирование,%s\n", errbuf); // выход(1); возвращаться; } в то время как (рет >= 0) { ret = avcodec_receive_packet (enc_ctx, pkt); if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) возвращаться; иначе, если (рет pts); /* ret = av_interleaved_write_frame(outFormatCtx, pkt); если (рет < 0) { LOGE2("ошибка записи кадра=%s", av_err2str(ret)); перерыв; }*/ // printf("Запись пакета %3"PRId64" (size=%5d)\n", pkt->pts, pkt->size); av_write_frame (outFormatCtx, ПКТ); // Записываем пакет в поток RTMP av_packet_unref (пкт); } } PUSHER_FUNC(int, testPush, jstring yuvPath, jstring outputPath) { const char *yvu_path = env->GetStringUTFChars(yuvPath, JNI_FALSE); const char *output_path = env->GetStringUTFChars(outputPath, JNI_FALSE); const char *rtmp_url = выходной_путь; const AVCodec *кодек; AVCodecContext *codecContext = NULL; AVFormatContext *outFormatCtx; INT РЕТ = 0; AVStream *outStream; AVFrame *frame; AVPacket *pkt; интервал я, х, у; avformat_network_init(); кодек = avcodec_find_encoder (AV_CODEC_ID_H264); // кодек = avcodec_find_encoder(AV_CODEC_ID_MPEG4); // кодек = avcodec_find_encoder(AV_CODEC_ID_H265); если (!кодек) { LOGE2("Ошибка JNI при обнаружении кодера H.264"); вернуть -1; } codecContext = avcodec_alloc_context3 (кодек); если (!codecContext) { fprintf(stderr, "Не удалось выделить контекст видеокодека\n"); вернуть -1; } /* Выделяем выходной контекст */ outFormatCtx = avformat_alloc_context(); если (!outFormatCtx) { fprintf(stderr, «Не удалось выделить выходной контекст\n»); вернуть -1; } /* Открываем вывод RTMP */ const AVOutputFormat *ofmt = av_guess_format("flv", NULL, NULL); // const AVOutputFormat *ofmt = av_guess_format("mpegts", NULL, NULL); // const AVOutputFormat *ofmt = av_guess_format("mp4", NULL, NULL); если (!ofmt) { fprintf(stderr, «Не удалось найти выходной формат\n»); вернуть -1; } outFormatCtx->oformat = ofmt; outFormatCtx->url = av_strdup(rtmp_url); /* Добавляем видеопоток */ outStream = avformat_new_stream (outFormatCtx, кодек); если (!outStream) { fprintf(stderr, «Не удалось выделить поток\n»); вернуть -1; } outStream-> codecpar-> codec_type = AVMEDIA_TYPE_VIDEO; outStream->codecpar->codec_id = codec->id; outStream-> codecpar-> ширина = 352; outStream-> codecpar-> высота = 288; /* Устанавливаем выходной URL */ av_dict_set(&outFormatCtx->метаданные, «url», rtmp_url, 0); pkt = av_packet_alloc(); если (!пкт) вернуть -1; /* ... (остальная часть кода установки) ... */ /* помещаем образцы параметров */ codecContext->bit_rate = 400000; /* разрешение должно быть кратно двум */ codecContext-> ширина = 352; codecContext-> высота = 288; /* кадров в секунду */ codecContext->time_base = (AVRational) {1, 25}; codecContext->framerate = (AVRational) {25, 1}; /* выдаем один внутренний кадр каждые десять кадров * проверьте pict_type кадра перед передачей кадра * для кодировщика, если тип кадра->pict_type равен AV_PICTURE_TYPE_I * тогда gop_size игнорируется и вывод кодировщика * всегда будет I-кадр, независимо от gop_size */ codecContext->gop_size = 10; codecContext->max_b_frames = 1; codecContext->pix_fmt = AV_PIX_FMT_YUV420P; если (кодек->id == AV_CODEC_ID_H264) av_opt_set(codecContext->priv_data, «предустановка», «медленно», 0); /* Открой это */ ret = avcodec_open2 (codecContext, кодек, NULL); если (рет < 0) { LOGE2("Ошибка открытия кодека JNI eer%s", av_err2str(ret)); вернуть возврат; } avcodec_parameters_to_context (codecContext, outStream-> codecpar); if (avio_open(&outFormatCtx->pb, rtmp_url, AVIO_FLAG_WRITE)) { fprintf(stderr, «Не удалось открыть вывод\n»); вернуть возврат; } /* Запись заголовка */ если (avformat_write_header(outFormatCtx, NULL) != 0) { fprintf(stderr, «Произошла ошибка при открытии вывода\n»); вернуть возврат; } рамка = av_frame_alloc(); если (!frame) { fprintf(stderr, «Невозможно выделить видеокадр\n»); вернуть -1; } кадр->формат = codecContext->pix_fmt; кадр-> формат = AV_PIX_FMT_YUV420P; кадр->формат = 0; рамка-> ширина = codecContext-> ширина; кадр->высота = codecContext->высота; ret = av_frame_get_buffer (кадр, 0); если (рет < 0) { fprintf(stderr, "Не удалось выделить данные видеокадра,%s\n", av_err2str(ret)); вернуть возврат; } /* ФАЙЛ *yuv_file = fopen(yvu_path, "rb"); если (yuv_file == NULL) { LOGE2("невозможно открыть файл h264"); вернуть -1; }*/ /* кодируем 1 секунду видео */ для (я = 0; я размер строки[0] + x] = x + y + i * 3; } } /* Cb и Cr */ for (y = 0; y height/2; y++) { for (x = 0; x width / 2; x++) { кадр->данные[1][y * Frame->размер строки[1] + x] = 128 + y + i * 2; кадр->данные[2][y *frame->размер строки[2] + x] = 64 + x + i * 5; } } кадр->pts = я; /* кодируем изображение */ кодировать (codecContext, кадр, pkt, outFormatCtx); } // fclose(yuv_file); /* очищаем кодировщик */ кодировать (codecContext, NULL, pkt, outFormatCtx); /* Написать трейлер */ av_write_trailer (outFormatCtx); /* Закрываем вывод */ avformat_free_context (outFormatCtx); avcodec_free_context(&codecContext); av_frame_free(&frame); av_packet_free(&пкт); } win11:
#include #include #include #include #include #include #include #include кодирование статической силы (AVCodecContext *enc_ctx, AVFrame *frame, AVPacket *pkt, AVFormatContext *outFormatCtx) { интервал врет; /* отправляем кадр в кодер */ если (кадр) printf("Отправить кадр %3"PRId64"\n",frame->pts); ret = avcodec_send_frame(enc_ctx,frame); если (рет < 0) { char errbuf[AV_ERROR_MAX_STRING_SIZE]; av_strerror(ret, errbuf, AV_ERROR_MAX_STRING_SIZE); fprintf(stderr, "Ошибка отправки кадра для кодирования,%s\n", errbuf); выход (1); } в то время как (рет >= 0) { ret = avcodec_receive_packet (enc_ctx, pkt); if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) возвращаться; иначе, если (рет pts, pkt->size); av_write_frame (outFormatCtx, ПКТ); // Записываем пакет в поток RTMP av_packet_unref (пкт); } } int main(int argc, char **argv) { av_log_set_level (AV_LOG_DEBUG); const char *rtmp_url, *codec_name; const AVCodec *кодек; AVCodecContext *codecContext = NULL; int я, ret, х, у; AVFormatContext *outFormatCtx; AVStream *st; AVFrame *frame; AVPacket *pkt; uint8_t endcode[] = {0, 0, 1, 0xb7}; если (argc oformat = ofmt; outFormatCtx->url = av_strdup(rtmp_url); /* Добавляем видеопоток */ st = avformat_new_stream (outFormatCtx, кодек); если (!st) { fprintf(stderr, «Не удалось выделить поток\n»); выход (1); } st->codecpar->codec_type = AVMEDIA_TYPE_VIDEO; st->codecpar->codec_id = codec->id; st-> codecpar-> ширина = 352; st-> codecpar-> высота = 288; // st->codecpar = c; // st->codecpar->format = AV_PIX_FMT_YUV420P; // Устанавливаем параметры видеопотока // st->codecpar->framerate = (AVRational){25, 1}; /* Устанавливаем выходной URL */ av_dict_set(&outFormatCtx->метаданные, «url», rtmp_url, 0); pkt = av_packet_alloc(); если (!пкт) выход (1); /* ... (остальная часть кода установки) ... */ /* помещаем образцы параметров */ codecContext->bit_rate = 400000; /* разрешение должно быть кратно двум */ codecContext-> ширина = 352; codecContext-> высота = 288; /* кадров в секунду */ codecContext->time_base = (AVRational) {1, 25}; codecContext->framerate = (AVRational) {25, 1}; /* выдаем один внутренний кадр каждые десять кадров * проверьте pict_type кадра перед передачей кадра * для кодировщика, если тип кадра->pict_type равен AV_PICTURE_TYPE_I * тогда gop_size игнорируется и вывод кодировщика * всегда будет I-кадр, независимо от gop_size */ codecContext->gop_size = 10; codecContext->max_b_frames = 1; codecContext->pix_fmt = AV_PIX_FMT_YUV420P; если (кодек->id == AV_CODEC_ID_H264) av_opt_set(codecContext->priv_data, «предустановка», «медленно», 0); /* Открой это */ ret = avcodec_open2 (codecContext, кодек, NULL); если (рет < 0) { fprintf(stderr, "Не удалось открыть кодек: %s\n", av_err2str(ret)); выход (1); } avcodec_parameters_to_context (codecContext, st-> codecpar); if (avio_open(&outFormatCtx->pb, rtmp_url, AVIO_FLAG_WRITE)) { fprintf(stderr, «Не удалось открыть вывод\n»); выход (1); } /* Запись заголовка */ если (avformat_write_header(outFormatCtx, NULL) != 0) { fprintf(stderr, «Произошла ошибка при открытии вывода\n»); выход (1); } рамка = av_frame_alloc(); если (!frame) { fprintf(stderr, «Невозможно выделить видеокадр\n»); выход (1); } // кадр->формат = c->pix_fmt; // кадр->формат = AV_PIX_FMT_YUV420P; кадр->формат = 0; рамка-> ширина = codecContext-> ширина; кадр->высота = codecContext->высота; ret = av_frame_get_buffer (кадр, 0); если (рет < 0) { fprintf(stderr, "Не удалось выделить данные видеокадра,%s\n", av_err2str(ret)); выход (1); } /* кодируем 1 секунду видео */ для (я = 0; я размер строки[0] + x] = x + y + i * 3; } } /* Cb и Cr */ for (y = 0; y height/2; y++) { for (x = 0; x width / 2; x++) { кадр->данные[1][y * Frame->размер строки[1] + x] = 128 + y + i * 2; кадр->данные[2][y *frame->размер строки[2] + x] = 64 + x + i * 5; } } кадр->pts = я; /* кодируем изображение */ кодировать (codecContext, кадр, pkt, outFormatCtx); } /* очищаем кодировщик */ кодировать (codecContext, NULL, pkt, outFormatCtx); /* Написать трейлер */ av_write_trailer (outFormatCtx); /* Закрываем вывод */ avformat_free_context (outFormatCtx); avcodec_free_context(&codecContext); av_frame_free(&frame); av_packet_free(&пкт); вернуть 0; } Я подозреваю, что это проблема с скомпилированной мной библиотекой ffmpeg, поэтому я искал инструкции по компиляции ffmpeg на GitHub, но скомпилированный пакет по-прежнему имеет ту же проблему. Я не знаю, что теперь делать.
У меня есть тот же код, который может успешно передавать потоки (rtmp) в среду, но в среде Android у меня происходит сбой с сообщением об ошибке. Метод сообщения об ошибке — avcodec_send_frame в ffmpeg6.1. Кстати, библиотеку FFmpeg на Android я собирал сам, а для Win11 скачал официальный пакет. Ниже я предоставлю код для Android и Win11.
андроид:
static void encode(AVCodecContext *enc_ctx, AVFrame *frame, AVPacket *pkt, AVFormatContext *outFormatCtx) { интервал врет; /* отправляем кадр в кодер */ если (кадр) LOGE2("Отправить кадр %ld\n",frame->pts); ret = avcodec_send_frame(enc_ctx,frame); если (рет < 0) { char errbuf[AV_ERROR_MAX_STRING_SIZE]; av_strerror(ret, errbuf, AV_ERROR_MAX_STRING_SIZE); LOGE2("Ошибка отправки кадра на кодирование,%s\n", errbuf); // выход(1); возвращаться; } в то время как (рет >= 0) { ret = avcodec_receive_packet (enc_ctx, pkt); if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) возвращаться; иначе, если (рет pts); /* ret = av_interleaved_write_frame(outFormatCtx, pkt); если (рет < 0) { LOGE2("ошибка записи кадра=%s", av_err2str(ret)); перерыв; }*/ // printf("Запись пакета %3"PRId64" (size=%5d)\n", pkt->pts, pkt->size); av_write_frame (outFormatCtx, ПКТ); // Записываем пакет в поток RTMP av_packet_unref (пкт); } } PUSHER_FUNC(int, testPush, jstring yuvPath, jstring outputPath) { const char *yvu_path = env->GetStringUTFChars(yuvPath, JNI_FALSE); const char *output_path = env->GetStringUTFChars(outputPath, JNI_FALSE); const char *rtmp_url = выходной_путь; const AVCodec *кодек; AVCodecContext *codecContext = NULL; AVFormatContext *outFormatCtx; INT РЕТ = 0; AVStream *outStream; AVFrame *frame; AVPacket *pkt; интервал я, х, у; avformat_network_init(); кодек = avcodec_find_encoder (AV_CODEC_ID_H264); // кодек = avcodec_find_encoder(AV_CODEC_ID_MPEG4); // кодек = avcodec_find_encoder(AV_CODEC_ID_H265); если (!кодек) { LOGE2("Ошибка JNI при обнаружении кодера H.264"); вернуть -1; } codecContext = avcodec_alloc_context3 (кодек); если (!codecContext) { fprintf(stderr, "Не удалось выделить контекст видеокодека\n"); вернуть -1; } /* Выделяем выходной контекст */ outFormatCtx = avformat_alloc_context(); если (!outFormatCtx) { fprintf(stderr, «Не удалось выделить выходной контекст\n»); вернуть -1; } /* Открываем вывод RTMP */ const AVOutputFormat *ofmt = av_guess_format("flv", NULL, NULL); // const AVOutputFormat *ofmt = av_guess_format("mpegts", NULL, NULL); // const AVOutputFormat *ofmt = av_guess_format("mp4", NULL, NULL); если (!ofmt) { fprintf(stderr, «Не удалось найти выходной формат\n»); вернуть -1; } outFormatCtx->oformat = ofmt; outFormatCtx->url = av_strdup(rtmp_url); /* Добавляем видеопоток */ outStream = avformat_new_stream (outFormatCtx, кодек); если (!outStream) { fprintf(stderr, «Не удалось выделить поток\n»); вернуть -1; } outStream-> codecpar-> codec_type = AVMEDIA_TYPE_VIDEO; outStream->codecpar->codec_id = codec->id; outStream-> codecpar-> ширина = 352; outStream-> codecpar-> высота = 288; /* Устанавливаем выходной URL */ av_dict_set(&outFormatCtx->метаданные, «url», rtmp_url, 0); pkt = av_packet_alloc(); если (!пкт) вернуть -1; /* ... (остальная часть кода установки) ... */ /* помещаем образцы параметров */ codecContext->bit_rate = 400000; /* разрешение должно быть кратно двум */ codecContext-> ширина = 352; codecContext-> высота = 288; /* кадров в секунду */ codecContext->time_base = (AVRational) {1, 25}; codecContext->framerate = (AVRational) {25, 1}; /* выдаем один внутренний кадр каждые десять кадров * проверьте pict_type кадра перед передачей кадра * для кодировщика, если тип кадра->pict_type равен AV_PICTURE_TYPE_I * тогда gop_size игнорируется и вывод кодировщика * всегда будет I-кадр, независимо от gop_size */ codecContext->gop_size = 10; codecContext->max_b_frames = 1; codecContext->pix_fmt = AV_PIX_FMT_YUV420P; если (кодек->id == AV_CODEC_ID_H264) av_opt_set(codecContext->priv_data, «предустановка», «медленно», 0); /* Открой это */ ret = avcodec_open2 (codecContext, кодек, NULL); если (рет < 0) { LOGE2("Ошибка открытия кодека JNI eer%s", av_err2str(ret)); вернуть возврат; } avcodec_parameters_to_context (codecContext, outStream-> codecpar); if (avio_open(&outFormatCtx->pb, rtmp_url, AVIO_FLAG_WRITE)) { fprintf(stderr, «Не удалось открыть вывод\n»); вернуть возврат; } /* Запись заголовка */ если (avformat_write_header(outFormatCtx, NULL) != 0) { fprintf(stderr, «Произошла ошибка при открытии вывода\n»); вернуть возврат; } рамка = av_frame_alloc(); если (!frame) { fprintf(stderr, «Невозможно выделить видеокадр\n»); вернуть -1; } кадр->формат = codecContext->pix_fmt; кадр-> формат = AV_PIX_FMT_YUV420P; кадр->формат = 0; рамка-> ширина = codecContext-> ширина; кадр->высота = codecContext->высота; ret = av_frame_get_buffer (кадр, 0); если (рет < 0) { fprintf(stderr, "Не удалось выделить данные видеокадра,%s\n", av_err2str(ret)); вернуть возврат; } /* ФАЙЛ *yuv_file = fopen(yvu_path, "rb"); если (yuv_file == NULL) { LOGE2("невозможно открыть файл h264"); вернуть -1; }*/ /* кодируем 1 секунду видео */ для (я = 0; я размер строки[0] + x] = x + y + i * 3; } } /* Cb и Cr */ for (y = 0; y height/2; y++) { for (x = 0; x width / 2; x++) { кадр->данные[1][y * Frame->размер строки[1] + x] = 128 + y + i * 2; кадр->данные[2][y *frame->размер строки[2] + x] = 64 + x + i * 5; } } кадр->pts = я; /* кодируем изображение */ кодировать (codecContext, кадр, pkt, outFormatCtx); } // fclose(yuv_file); /* очищаем кодировщик */ кодировать (codecContext, NULL, pkt, outFormatCtx); /* Написать трейлер */ av_write_trailer (outFormatCtx); /* Закрываем вывод */ avformat_free_context (outFormatCtx); avcodec_free_context(&codecContext); av_frame_free(&frame); av_packet_free(&пкт); } win11:
#include #include #include #include #include #include #include #include кодирование статической силы (AVCodecContext *enc_ctx, AVFrame *frame, AVPacket *pkt, AVFormatContext *outFormatCtx) { интервал врет; /* отправляем кадр в кодер */ если (кадр) printf("Отправить кадр %3"PRId64"\n",frame->pts); ret = avcodec_send_frame(enc_ctx,frame); если (рет < 0) { char errbuf[AV_ERROR_MAX_STRING_SIZE]; av_strerror(ret, errbuf, AV_ERROR_MAX_STRING_SIZE); fprintf(stderr, "Ошибка отправки кадра для кодирования,%s\n", errbuf); выход (1); } в то время как (рет >= 0) { ret = avcodec_receive_packet (enc_ctx, pkt); if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) возвращаться; иначе, если (рет pts, pkt->size); av_write_frame (outFormatCtx, ПКТ); // Записываем пакет в поток RTMP av_packet_unref (пкт); } } int main(int argc, char **argv) { av_log_set_level (AV_LOG_DEBUG); const char *rtmp_url, *codec_name; const AVCodec *кодек; AVCodecContext *codecContext = NULL; int я, ret, х, у; AVFormatContext *outFormatCtx; AVStream *st; AVFrame *frame; AVPacket *pkt; uint8_t endcode[] = {0, 0, 1, 0xb7}; если (argc oformat = ofmt; outFormatCtx->url = av_strdup(rtmp_url); /* Добавляем видеопоток */ st = avformat_new_stream (outFormatCtx, кодек); если (!st) { fprintf(stderr, «Не удалось выделить поток\n»); выход (1); } st->codecpar->codec_type = AVMEDIA_TYPE_VIDEO; st->codecpar->codec_id = codec->id; st-> codecpar-> ширина = 352; st-> codecpar-> высота = 288; // st->codecpar = c; // st->codecpar->format = AV_PIX_FMT_YUV420P; // Устанавливаем параметры видеопотока // st->codecpar->framerate = (AVRational){25, 1}; /* Устанавливаем выходной URL */ av_dict_set(&outFormatCtx->метаданные, «url», rtmp_url, 0); pkt = av_packet_alloc(); если (!пкт) выход (1); /* ... (остальная часть кода установки) ... */ /* помещаем образцы параметров */ codecContext->bit_rate = 400000; /* разрешение должно быть кратно двум */ codecContext-> ширина = 352; codecContext-> высота = 288; /* кадров в секунду */ codecContext->time_base = (AVRational) {1, 25}; codecContext->framerate = (AVRational) {25, 1}; /* выдаем один внутренний кадр каждые десять кадров * проверьте pict_type кадра перед передачей кадра * для кодировщика, если тип кадра->pict_type равен AV_PICTURE_TYPE_I * тогда gop_size игнорируется и вывод кодировщика * всегда будет I-кадр, независимо от gop_size */ codecContext->gop_size = 10; codecContext->max_b_frames = 1; codecContext->pix_fmt = AV_PIX_FMT_YUV420P; если (кодек->id == AV_CODEC_ID_H264) av_opt_set(codecContext->priv_data, «предустановка», «медленно», 0); /* Открой это */ ret = avcodec_open2 (codecContext, кодек, NULL); если (рет < 0) { fprintf(stderr, "Не удалось открыть кодек: %s\n", av_err2str(ret)); выход (1); } avcodec_parameters_to_context (codecContext, st-> codecpar); if (avio_open(&outFormatCtx->pb, rtmp_url, AVIO_FLAG_WRITE)) { fprintf(stderr, «Не удалось открыть вывод\n»); выход (1); } /* Запись заголовка */ если (avformat_write_header(outFormatCtx, NULL) != 0) { fprintf(stderr, «Произошла ошибка при открытии вывода\n»); выход (1); } рамка = av_frame_alloc(); если (!frame) { fprintf(stderr, «Невозможно выделить видеокадр\n»); выход (1); } // кадр->формат = c->pix_fmt; // кадр->формат = AV_PIX_FMT_YUV420P; кадр->формат = 0; рамка-> ширина = codecContext-> ширина; кадр->высота = codecContext->высота; ret = av_frame_get_buffer (кадр, 0); если (рет < 0) { fprintf(stderr, "Не удалось выделить данные видеокадра,%s\n", av_err2str(ret)); выход (1); } /* кодируем 1 секунду видео */ для (я = 0; я размер строки[0] + x] = x + y + i * 3; } } /* Cb и Cr */ for (y = 0; y height/2; y++) { for (x = 0; x width / 2; x++) { кадр->данные[1][y * Frame->размер строки[1] + x] = 128 + y + i * 2; кадр->данные[2][y *frame->размер строки[2] + x] = 64 + x + i * 5; } } кадр->pts = я; /* кодируем изображение */ кодировать (codecContext, кадр, pkt, outFormatCtx); } /* очищаем кодировщик */ кодировать (codecContext, NULL, pkt, outFormatCtx); /* Написать трейлер */ av_write_trailer (outFormatCtx); /* Закрываем вывод */ avformat_free_context (outFormatCtx); avcodec_free_context(&codecContext); av_frame_free(&frame); av_packet_free(&пкт); вернуть 0; } Я подозреваю, что это проблема с скомпилированной мной библиотекой ffmpeg, поэтому я искал инструкции по компиляции ffmpeg на GitHub, но скомпилированный пакет по-прежнему имеет ту же проблему. Я не знаю, что теперь делать.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
GDALWarpRegionToBuffer и мозаика, когда Dst Frame не содержится строго в Src Frame
Anonymous » » в форуме C++ - 0 Ответы
- 89 Просмотры
-
Последнее сообщение Anonymous
-