最近在学习音视频开发,需要开发一个从flv文件中提取h264码流的demo。
具体的原理,在雷神的文章中写的很清楚了:
https://blog.csdn.net/leixiaohua1020/article/details/39767055
https://blog.csdn.net/leixiaohua1020/article/details/39802819
在这里致敬一下雷神,给我们这些小白入门音视频铺平了道路!
但是雷神在Demo中使用的API是旧版本的API,比如bitstream_filter相关的:
av_bitstream_filter_init()
av_bitstream_filter_filter()
等,这些API即将被弃用,我们需要使用新版本的API。
但是网上并没有找到相关的实现,根据上面链接的方法也并不能正确解析出h264码流。
在分析bitstream_filter.c源码后我们发现,在调用av_bsf_init()前需要调用avcodec_parameters_from_context(),增加解码必要的一些参数。
修改后的demo如下,大家可以用来参考。因为我也是刚入门,所以欢迎大家批评指正~:
#include <stdio.h>
#include <libavformat/avformat.h>
#define FFMPEG_NEW
int main() {
AVFormatContext *ifmt_ctx = NULL;
AVPacket pkt;
int ret, i;
int videoindex = -1, audioindex = -1;
const char *in_filename = "demo.flv";
const char *out_filename_v = "ffmpeg_demo.h264";
const char *out_filename_a = "ffmpeg_demo.mp3";
//av_register_all(); 已废弃
if ((ret = avformat_open_input(&ifmt_ctx, in_filename, 0, 0)) < 0) {
printf("Could not open input file.");
goto ERROR;
}
if ((ret = avformat_find_stream_info(ifmt_ctx, 0)