本文共 1499 字,大约阅读时间需要 4 分钟。
本实现参考雷神的代码,在此基础上扩展了读取rtsp/rtmp流以及内存数据的能力。该方法支持通过rtsp/rtmp推送h264/h265流,flv则仅支持h264流(h265扩展暂不支持)。在内存数据推流时,需注意以下几点:
内存数据读取注意事项:在调用 avformat_open_input 之前,必须确保内存数据已到位,否则会导致文件打开失败。此外,第一帧必须是IDR帧(独立决断帧)。
实现特点:
代码实现细节:
avformat_open_input 和 avformat_find_stream_info 读取输入流信息。av_read_frame 逐帧读取视频流数据,并通过 av_interleaved_write_frame 进行推流。优点:实现简单,稳定性高,适合对 rtsp/rtmp 流推流有具体需求的场景。
本实现基于参考代码,主要针对直接填充 AVPacket 数据的推流方式进行了细化。这种方法适用于对自定义视频流数据进行处理后再进行推流,支持rtsp/rtmp流的推送,但需要注意以下几点:
实现特点:
代码实现细节:
av_read_frame 读取输入视频流数据,并将其复制到 AVPacket 数据结构中。AV_PKT_FLAG_KEY 标志。av_interleaved_write_frame 进行推流。优点:适合对视频流格式有高度控制需求的场景,支持自定义视频流处理。
该实现基于 FFmpeg 在 Ubuntu 14 系统中进行推音视频的功能演示。该代码框架清晰,易于扩展,适合用于音视频同步推流场景。由于篇幅限制,代码细节将简要说明。
实现特点:
代码实现细节:
avformat_open_input 和 avformat_alloc_output_context2 分别打开输入输出流。av_read_frame 读取输入流数据,并进行视频流处理后推送到输出流中。av_interleaved_write_frame 实现视频流的按间隔写入。两种 FFmpeg 推流实现方式各有特点,选择哪种实现方式取决于具体需求:
通过合理配置和优化,这两种实现方式均能满足不同场景下的推流需求。
转载地址:http://vtoe.baihongyu.com/