Я пытаюсь прочитать видео файл 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?