ffmpeg 可以解析/解码 AVCC 格式的数据包吗?

标签 c video ffmpeg decoder

根据Need to convert h264 stream from annex-b format to AVCC format :

AnnexB format:

([start code] NALU) | ( [start code] NALU) |

AVCC format:

([extradata]) | ([length] NALU) | ([length] NALU) |
目前,您可以使用 av_parser_parse2 解析比特流(AnnexB 格式)然后将此缓冲区传递给 avcodec_send_frame ,但是 AVCC 格式呢?有解析器吗?

最佳答案

是的,这是可能的。
您需要传递 avcC 的内容框至AVCodecContext::extradata解码器将对其进行解析,以获得解码所需的 PPS 和 SPS NALU。
这是一个如何做到这一点的例子:

// `avcC` box retrieved from an MP4
char avcC[] = "...";

// Create codec parameters and copy the avcC box as extradata
codec_params = avcodec_parameters_alloc();
memcpy(codec_params.extradata, &avcC, sizeof(avcC));
codec_params.extradata_size = sizeof(avcC);

// Create the codec context and initialize it with codec parameters
codec_context = avcodec_alloc_context3();
avcodec_parameters_to_context(codec_context, codec_params);

// Create the codec and initialize it
codec = avcodec_find_decoder(AV_CODEC_ID_H264);
avcodec_open2(codec_context, codec, NULL);

AVCC 格式假定 PPS 和 SPS NALU 是“带外”提供的,这意味着它们不像附件 B 格式那样是流的一部分。 This excellent SO answer提供有关差异的更多详细信息。
在 MP4 容器中,这些 NALU 位于 avcC框,位于 MP4 框层次结构中的以下路径:
moov > trak > mdia > minf > stbl > stsd > avc1 > avcC

关于ffmpeg 可以解析/解码 AVCC 格式的数据包吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68877677/

相关文章:

c - 在c中使用int main()时是否必须使用return 0语句?

c - C中的数据封装

android - 使用 ffmpeg 进行视频定向

css - 如何从嵌入视频中删除边框(squarespace)

java - 如何终止通常使用 ProcessBuilder 创建的进程

video - 通过 FFmpeg 向 Instagram 或 Snapchat 等视频添加过滤器

ffmpeg - 尝试转换视频文件但视频可播放时出现错误消息 "Invalid data found when processing input"

c - 如何将项目扫描到 void* 数组中?

c++ - 如果忽略返回值,如何发出警告?

android - cordova android - 如何播放位于项目本身内部的视频文件