ffmpeg 自定义数据来源

    xiaoxiao2022-06-30  162

    ffmpeg 自定义数据来源, 可以是文件,可以是内存,可以是网络

    // ffmpeg_custom_context.cpp : Defines the entry point for the console application.

    //

    #include "stdafx.h"

    extern "C"

    {

    #include <libavformat/avformat.h>

    };

    #pragma comment(lib, "avformat.lib")

    int ReadFunc(void* ptr, uint8_t* buf, int buf_size)

    {

    FILE* fp = (FILE*)ptr;

    size_t size = fread(buf, 1, buf_size, fp);

    int ret = size;

    return ret;

    }  //这个函数你可以自由发挥。一定要自由发挥。我没有网络流就从文件读了, 一般来说这里不能返回-1 或者0, 否则ffmpeg认为结束、或失败了。 你不想读文件,就直接从内存拷一段数据给buf即可。 接受的网络流、底层上采集卡上来的流都可以在这里,,,,

    //一定要注意这个函数,ffmpeg的实现就是一个坑,一不小心就中招了。

    int64_t seek_func(void *opaque, int64_t offset, int whence)

    {

    int64_t ret;

    FILE *fp = (FILE*)opaque;

    if (whence == AVSEEK_SIZE) {

    return -1;

    }

    fseek(fp, offset, whence);

    return ftell(fp);

    }

    int _tmain(int argc, _TCHAR* argv[])

    {

    av_register_all();

    int ret = 0;

    FILE* fp = fopen("./BoyGirls.mp4", "rb");

    int nBufferSize = 1024 * 1024;

    unsigned char* pBuffer = new unsigned char[nBufferSize];

    AVFormatContext* pFormatCtx = NULL;

    AVInputFormat *piFmt = NULL;

    AVCodecContext *vcodecCtx = NULL, *acodecCtx = NULL;

    AVCodec *vdec = NULL, *adec = NULL;

    int ai = -1, vi = -1;

    // Allocate the AVIOContext:

    AVIOContext* pIOCtx = avio_alloc_context(pBuffer, nBufferSize,

    0,

    fp,

    ReadFunc,

    0,

    seek_func);

    //step2:探测流格式  

    ret = av_probe_input_buffer(pIOCtx, &piFmt, "", NULL, 0, 0);

    if (ret < 0) {

    fprintf(stderr, "probe failed!\n");

    goto quit;

    }

    else {

    fprintf(stdout, "probe success!\n");

    fprintf(stdout, "format: %s[%s]\n", piFmt->name, piFmt->long_name);

    }

    // Allocate the AVFormatContext:

    pFormatCtx = avformat_alloc_context();

    // Set the IOContext:

    pFormatCtx->pb = pIOCtx;

    pFormatCtx->flags = AVFMT_FLAG_CUSTOM_IO;

    //step4:打开流  

    if (avformat_open_input(&pFormatCtx, "", piFmt, NULL) < 0) {

    fprintf(stderr, "avformat open failed.\n");

    goto quit;

    }

    else {

    fprintf(stdout, "open stream success!\n");

    }

    if (avformat_find_stream_info(pFormatCtx, NULL)<0)

    {

    printf("av_find_stream_info error \n");

    goto quit;

    }

    //接下来该做什么??? 喂,你要做什么?

    quit:

    avformat_close_input(&pFormatCtx);

    delete[]pBuffer;

    return 0;

    }

    转载:

    http://hi.baidu.com/mingyuejingque/item/725c288bd2efeb2b100ef3f2

    转载请注明原文地址: https://ju.6miu.com/read-1126289.html

    最新回复(0)