FFmpeg: «При обработке ввода найдены неверные данные» при чтении видео из памяти - PullRequest
0 голосов
/ 24 апреля 2020

Я пытаюсь прочитать видео файл mp4 из памяти с помощью библиотек C ++ и FFmpeg, но я получил ошибку «Обнаружены неверные данные при обработке ввода». Вот мои коды:

#include <cstdio>
#include <fstream>
#include <filesystem>

extern "C"
{
#include "libavformat/avformat.h"
#include "libavformat/avio.h"
}

using namespace std;
namespace fs = std::filesystem;

struct VideoBuffer
{
    uint8_t* ptr;
    size_t size;
};

static int read_packet(void* opaque, uint8_t* buf, int buf_size)
{
    VideoBuffer* vb = (VideoBuffer*)opaque;
    buf_size = FFMIN(buf_size, vb->size);

    if (!buf_size) {
        return AVERROR_EOF;
    }

    printf("ptr:%p size:%zu\n", vb->ptr, vb->size);

    memcpy(buf, vb->ptr, buf_size);
    vb->ptr += buf_size;
    vb->size -= buf_size;

    return buf_size;
}

void print_ffmpeg_error(int ret)
{
    char* err_str = new char[256];
    av_strerror(ret, err_str, 256);
    printf("%s\n", err_str);
    delete[] err_str;
}

int main()
{
    fs::path video_path = "test.mp4";
    ifstream video_file;
    video_file.open(video_path);
    if (!video_file) {
        abort();
    }
    size_t video_size = fs::file_size(video_path);
    char* video_ptr = new char[video_size];
    video_file.read(video_ptr, video_size);
    video_file.close();

    VideoBuffer vb;
    vb.ptr = (uint8_t*)video_ptr;
    vb.size = video_size;

    AVIOContext* avio = nullptr;
    uint8_t* avio_buffer = nullptr;
    size_t avio_buffer_size = 4096;
    avio_buffer = (uint8_t*)av_malloc(avio_buffer_size);
    if (!avio_buffer) {
        abort();
    }

    avio = avio_alloc_context(avio_buffer, avio_buffer_size, 0, &vb, read_packet, nullptr, nullptr);

    AVFormatContext* fmt_ctx = avformat_alloc_context();
    if (!fmt_ctx) {
        abort();
    }
    fmt_ctx->pb = avio;

    int ret = 0;
    ret = avformat_open_input(&fmt_ctx, nullptr, nullptr, nullptr);
    if (ret < 0) {
        print_ffmpeg_error(ret);
    }

    avformat_close_input(&fmt_ctx);
    av_freep(&avio->buffer);
    av_freep(&avio);
    delete[] video_ptr;
    return 0;
}

И вот что я получил:

ptr:000001E10CEA0070 size:4773617
ptr:000001E10CEA1070 size:4769521
...
ptr:000001E10D32D070 size:1777
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001e10caaeac0] moov atom not found
Invalid data found when processing input

FFmpeg версия 4.2.2, с Windows 10 и Visual Studio 2019 в режиме отладки x64 , Библиотека FFmpeg - это скомпилированная общая библиотека Windows с домашней страницы FFmpeg. Некоторые коды взяты из официального примера avio_reading.c. Целевой файл MP4 может нормально воспроизводиться проигрывателем VL C, поэтому я думаю, что файл в порядке. Что-нибудь не так в моих кодах? Или это проблема с библиотекой FFmpeg?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...