学习雷博士的文章
环境:Ubuntu 16.04.7
ffmpeg-6.1
1、下载雷博士测试代码
https://github.com/leixiaohua1020/simplest_ffmpeg_streamer
测试 simplest_ffmpeg_streamer/simplest_ffmpeg_streamer.cpp
程序流程图搬过来:
接口说明:
avformat_open_input()
打开输入文件,初始化输入视频码流的AVFormatContext
av_read_frame()
从输入文件中读取一个AVPacket
avformat_alloc_output_context2()
初始化输出视频码流的AVFormatContext
avformat_new_stream()
创建输出码流的AVStream
avio_open()
打开输出文件
avformat_write_header()
写文件头(对于某些没有文件头的封装格式,不需要此函数。比如说MPEG2TS)
av_interleaved_write_frame()
将AVPacket(存储视频压缩码流数据)写入文件
av_write_trailer()
写文件尾(对于某些没有文件头的封装格式,不需要此函数。比如说MPEG2TS)
笔者用的是ffmpeg-6.1,有些接口变化了
1)av_register_all 废弃
url改成自己的rtmp服务器
2)
旧版本:
if(pFormatCtx->streams[i]->codec->codec_type==AVMEDIA_TYPE_VIDEO){
新版本:
if(pFormatCtx->streams[i]->codecpar->codec_type==AVMEDIA_TYPE_VIDEO){
3)
旧版本:
ret = avcodec_copy_context(out_stream->codec, in_stream->codec);
新版本:
ret = avcodec_parameters_copy(out_stream->codecpar, in_stream->codecpar);
旧版本:
CODEC_FLAG_GLOBAL_HEADER
新版本:
/**
* Place global headers in extradata instead of every keyframe.
*/
#define AV_CODEC_FLAG_GLOBAL_HEADER (1 << 22)
置位则表示SPS/PPS放在extradata,而不是I帧前面
flags 在结构体 AVCodecContext中
/**
* AV_CODEC_FLAG_*.
* - encoding: Set by user.
* - decoding: Set by user.
*/
int flags;
4)
旧版本:
av_free_packet(&pkt);
新版本:
av_packet_unref(&pkt);
2、编译测试代码
gcc simplest_ffmpeg_streamer.cpp -o simplest_ffmpeg_streamer.out -I ../ffmpeg_dir/include/ -L ../ffmpeg_dir/lib/ -L ../x264_dir/lib -lavformat -lavcodec -lavutil -lswresample -lx264
3、运行
export LD_LIBRARY_PATH=xx/ffmpeg_dir/lib/:xx/x264_dir/lib
笔者用nginx搭建的rtmp服务器
./simplest_ffmpeg_streamer.out