最近在研究直播中各种音频和视频同步,以及音频视频处理的业务,所以自己搭建了一个简单的直播环境,用nginx做直播服务器,实现推流和拉流的场景模拟,首先nginx中的配置,是参考网上大神的配置。直接加入一个live的模拟server,然后ffmpeg推流的命令也是相当之简单,ffmpeg -re -i test.mp4 -f flv rtmp://localhost:1935/live,然后vlc直接输入网络串流地址,就可以播放,输入的可以是本地文件,也可以是网络上的rtmp之类的流。接下来想分析下ffmpeg中是如何实现推流的,所以下载了代码,并且参考了网上的博客来分析,具体地址 https://www.pianshen.com/article/2917358295/,
核心函数transcode(),分析如下:
1 transcode_init() 转码的初始化工作
1) av_dump_format() 解析并打印媒体输出格式
2) init_input_stream()->avcodec_open2()
3) avformat_write_header() 写输出文件的文件头
2 check_keyboard_interaction() 键盘检测操作,处理转码过程中的按键操作
3 transcode_step() 转码
1) process_input() 解码工作
get_input_packet() 读取一帧编码数据
av_read_frame()
output_packet() 解码一帧视频或者音频,直接写入输出
decode_video()
avcodec_decode_video2()
rate_emu_sleep()
configure_filtergraph()
av_buffersrc_add_frame()
decode_audio
avcodec_decode_audio4()
rate_emu_sleep()
configure_filtergraph()
av_buffersrc_add_frame()
av_streamcopy()
write_frame()
2) transcode_from_filter()
3) reap_filters() 解码工作
av_buffersink_get_buffer_ref() 从AVFilterContext中取出一帧解码后的数据
avfilter_copy_buf_probe() 将其转换为AVFrame
do_audio_out() 编码并写入
avcodec_encode_audio2()
write_frame()
av_bitstream_filter_filter()
av_interleaved_write_frame()
do_video_out()
avcodec_encode_video2()
write_frame()
do_video_status()
avfilter_unref_buffer() 释放资源
4 flush_encoders() 输出编码器中剩余帧
1438

被折叠的 条评论
为什么被折叠?



