如何将数据加载到 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 说明了我上面显示的部分的完整示例。)
我正在开发一个 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 说明了我上面显示的部分的完整示例。)