如何将数据加载到 FFmpeg - AVBuffer

How to load data to an FFmpeg - AVBuffer

我正在开发一个 FFmpeg 项目,我想手动加载视频片段,而不使用 av_read_frame(...) 来获取 AVPacket。我找到了 AVBufferRef 结构,但我不知道如何将块文件加载到其中。

你有什么建议或帮助吗?

更新: 当前代码如上:


main(){
    byte* buffer_data;  
    // (...) buffer_data <- 'h.264 file' - b-frame loaded from disk.

    AVBufferRef* pAVBuf = (AVBufferRef*)buffer_data;
    AVPacket pkt_demo;

    int r = av_packet_from_data(&pkt_demo, buffer_data, lSize);
    //or pkt_demo.buf = pAVBuf; ? 

    decode(codec_ctx, frame, &pkt_demo, fout);
    av_packet_unref(pkt);
}


void decode(AVCodecContext* dec_ctx, AVFrame* frame, AVPacket* pkt, FILE* f)
{
    int ret;

    //send packet to decoder
    ret = avcodec_send_packet(dec_ctx, pkt);
    if (ret < 0) {
        fprintf(stderr, "Error sending a packet for decoding\n");
        exit(1);
    }
    
    while (ret >= 0) {
        
        // receive frame from decoder
        // we may receive multiple frames or we may consume all data from decoder, then return to main loop
        ret = avcodec_receive_frame(dec_ctx, frame);
        if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) {
            printf("i'm on it\n");
            return;
        }
        else if (ret < 0) {
            // something wrong, quit program
            fprintf(stderr, "Error during decoding\n");
            exit(1);
        }
        printf("saving frame %3d\n", dec_ctx->frame_number);
        fflush(stdout);


        // display frame on sdl window
        displayFrame(frame, dec_ctx);

        // send frame info to writing function
        pgm_save(frame->data[0], frame->linesize[0], frame->width, frame->height, f);
    }
}






感谢您的宝贵时间。

函数:

 int av_packet_from_data (AVPacket *pkt, uint8_t *data, int size)       

av_malloc()ed data.[= 初始化一个 reference-counted 数据包18=]

但是在你的代码片段中,传递给这个函数的缓冲区还没有指向内存,它只是声明...

byte* buffer_data;  
// (...) buffer_data <- 'h.264 file' - b-frame loaded from disk.

此外,根据 av_packet_from_data() 的文档,缓冲区应创建为 uint_t * 以防止编译器发出警告。

改变这个:

byte* buffer_data;   

为此:

size_t buffer_size = 4096;
uint8_t *buffer_data = av_malloc(buffer_size);
if (!buffer_data) {
    //handle error
}
 AVPacket pkt_demo;
....
int r = av_packet_from_data(&pkt_demo, buffer_data, buffer_size);

您的代码中可能存在其他问题,但这解决了正确创建和使用缓冲区的问题。 (sample code here 说明了我上面显示的部分的完整示例。)