搭建了nginx直播,然后用ffmpeg推流以及vlc拉流播放的场景

最近在研究直播中各种音频和视频同步,以及音频视频处理的业务,所以自己搭建了一个简单的直播环境,用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() 输出编码器中剩余帧

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值