c-如何将数据加载到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 decodingn");
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 itn");
return;
}
else if (ret < 0) {
// something wrong, quit program
fprintf(stderr, "Error during decodingn");
exit(1);
}
printf("saving frame %3dn", 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((eddata中的引用计数数据包。

但在您的代码片段中,传递给该函数的缓冲区还没有指向内存,只是简单地声明了。。。

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);

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

最新更新