pse*_*ler 5 codec libavcodec libav libavformat
我正在尝试使用LibAV解码mpeg视频文件。我无法正确理解两个术语:Frames和Packets。
根据我目前的理解,帧是未压缩的视频帧,数据包是已压缩的帧。
问题:
回答你的第一个问题和第三个问题:
AVPacket: “对于视频,它通常应包含一个压缩帧。对于音频,它可能包含多个压缩帧。static void decode(AVCodecContext *dec_ctx, AVFrame *frame, AVPacket *pkt,
const char *filename)
{
char buf[1024];
int ret;
ret = avcodec_send_packet(dec_ctx, pkt);
if (ret < 0) {
fprintf(stderr, "Error sending a packet for decoding\n");
exit(1);
}
while (ret >= 0) {
ret = avcodec_receive_frame(dec_ctx, frame);
if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
return;
else if (ret < 0) {
fprintf(stderr, "Error during decoding\n");
exit(1);
}
printf("saving frame %3d\n", dec_ctx->frame_number);
fflush(stdout);
/* the picture is allocated by the decoder. no need to
free it */
snprintf(buf, sizeof(buf), filename, dec_ctx->frame_number);
pgm_save(frame->data[0], frame->linesize[0],
frame->width, frame->height, buf);
}
}
Run Code Online (Sandbox Code Playgroud)
基本上,帧是自然的,而数据包是人造的。
\n帧是重要的,数据包是辅助的\xe2\x80\x93,它们帮助通过可接受大小的较小部分连续处理流(而不是作为一个整体处理流)。\xe2\x80\x9c分而治之。\xe2\x80\x9d
\n\n\n\n数据包有多个帧,对吗?
\n
数据包可能有多个(编码的)帧,也可能只有一个,甚至不完整。
\n\n\n一帧只能是一个数据包的一部分吗?
\n
不。它可能分布在多个数据包中。参见 框架1见图中的
\n\n\n我指的是一半帧信息在packet1中,另一半在packet2中的情况?是否可以?
\n
是的。参见框架1。
\n\n\n我们如何知道 LibAV 中的数据包中有多少帧?
\n
在不同的多媒体文件中,每个数据包的帧可能不同,这取决于特定流的编码方式。
\n即使在同一个流中,也可能存在具有不同数量(编码)帧的数据包\xe2\x80\x93 比较数据包 0和数据包 1。
\n数据包中没有包含其包含多少(编码)帧的信息。
\n同一数据包中的帧通常具有不同的大小(如上图所示),因此数据包不是相同的元素(帧)的数组。
\n| 归档时间: |
|
| 查看次数: |
241 次 |
| 最近记录: |