96SEO 2026-02-19 12:29 0
对ffmpeg比较熟而且产品不要额外的定制和更高阶的要求未尝不可如果对产品稳定性、时延、断网重连等有更高的技术诉求比较好的办法还是采用我们的技术实现。

以大牛直播SDK的多路RTSP转RTMP推送模块为例首先拉取RTSP流把未解码的H.264/H.265、AAC/PCMA/PCMU数据回调上来然后通过调用推送模块的编码后数据接口同步转发出去整体下来几无多少延迟。
如果需要把数据投递到轻量级RTSP服务也可以。
系统设计架构图如下
转推通过RTMP直播推送SDK的编码后数据输入接口把回调上来的数据传给RTMP直播推送模块实现RTSP数据流到RTMP服务器的转发
录像如果需要录像借助RTSP直播播放SDK拉到音视频数据后直接存储MP4文件即可
快照如果需要实时快照拉流后解码调用播放端快照接口生成快照因为快照涉及到video数据解码如无必要可不必开启不然会额外消耗性能。
拉流预览如需预览拉流数据只要调用播放端的播放接口即可实现拉流数据预览
数据转AAC后转发考虑到好多监控设备出来的音频可能是PCMA/PCMU的如需要更通用的音频格式可以转AAC后在通过RTMP推送
转推RTMP实时静音只需要在传audio数据的地方加个判断即可
拉流速度反馈通过RTSP播放端的实时码率反馈event拿到实时带宽占用即可
整体网络状态反馈考虑到有些摄像头可能会临时或异常关闭RTMP服务器亦是可以通过推拉流的event回调状态查看那整体网络情况如此界定是拉不到流还是推不到RTMP服务器。
支持拉取rtmp流支持拉取rtsp流Windows支持本地flv文件转发(支持制定文件位置转发或转发过程中seek)支持本地预览支持转发过程中实时静音支持转发过程中切换rtmp/rtsp
url此外windows平台还支持切换本地flv文件支持录像模块扩展可边转发边录制每个文件录制开始结束均有状态回馈支持内网RTSP网关模块扩展拉取的流数据可以流入到内网RTSP网关模块对外微型RTSP媒体流服务RTSP
url便于内网访问音频AAC并支持拉流后的音频(PCMU/PCMA,Speex等)转AAC后再转发视频H.264、H.265支持h265转发(rtsp/rtmp
上述实现2016年我们已经非常成熟本次要谈的是开发者实际场景用到的一个技术需求如何实现视频用RTSP数据源获取到的音频采集麦克风的数据。
先说开始拉流、停止拉流设计如下如果是用rtsp的audio那么我们就开启audio数据的回调如果采用麦克风的这里只要开video的即可。
2){libPlayer.SmartPlayerSetAudioDataCallback(player_handle_,
PlayerAudioDataCallback(stream_publisher_));}if(video_opt_
2){libPlayer.SmartPlayerSetVideoDataCallback(player_handle_,
PlayerVideoDataCallback(stream_publisher_));}int
1;libPlayer.SmartPlayerSetPullStreamAudioTranscodeAAC(player_handle_,
libPlayer.SmartPlayerStartPullStream(player_handle_);if
stream!);if(!isPlaying){releasePlayerHandle();}return
player_handle_)return;libPlayer.SmartPlayerStopPullStream(player_handle_);if
!isPlaying){releasePlayerHandle();}
OpenPullHandle()实现逻辑如下常规的参数设置和event
rtsp://admin:daniulive12345192.168.0.120:554/h264/ch1/main/av_stream;if
libPlayer.SmartPlayerOpen(context_);if
false;}libPlayer.SetSmartPlayerEventCallbackV2(player_handle_,new
EventHandlePlayerV2());libPlayer.SmartPlayerSetBuffer(player_handle_,
speedlibPlayer.SmartPlayerSetReportDownloadSpeed(player_handle_,
10;libPlayer.SmartPlayerSetRTSPTimeout(player_handle_,
1;libPlayer.SmartPlayerSetRTSPAutoSwitchTcpUdp(player_handle_,
is_auto_switch_tcp_udp);libPlayer.SmartPlayerSaveImageFlag(player_handle_,
stream..//libPlayer.SmartPlayerSetRTSPTcpMode(playerHandle,
1);libPlayer.SmartPlayerSetUrl(player_handle_,
btnRTMPPusher.setOnClickListener(new
(stream_publisher_.is_rtmp_publishing())
{stopPush();btnRTMPPusher.setText(推送RTMP);return;}Log.i(TAG,
rtmp..);InitAndSetConfig();String
rtmp://192.168.0.104:1935/hls/stream1;//String
(!stream_publisher_.SetURL(rtmp_pusher_url))Log.e(TAG,
stream_publisher_.StartPublisher();if
{stream_publisher_.try_release();Log.e(TAG,
stream..);return;}startAudioRecorder();btnRTMPPusher.setText(停止推送);}
(!stream_publisher_.empty())return;Log.i(TAG,
libPublisher.SmartPublisherOpen(context_,
3;initialize_publisher(libPublisher,
gop);stream_publisher_.set(libPublisher,
这里可以看到我们在转推RTMP的时候调用了startAudioRecorder()来做麦克风的采集
NTAudioRecordV2(this);Log.i(TAG,
audio_recorder_.start()...);audio_recorder_callback_
NTAudioRecordV2CallbackImpl(stream_publisher_,
null);audio_recorder_.AddCallback(audio_recorder_callback_);if
(!audio_recorder_.Start(is_pcma_
{audio_recorder_.RemoveCallback(audio_recorder_callback_);audio_recorder_callback_
audio_recorder_)return;Log.i(TAG,
stopAudioRecorder);audio_recorder_.Stop();if
{audio_recorder_.RemoveCallback(audio_recorder_callback_);audio_recorder_callback_
采集到的audio回调上来后我们调RTMP推送接口把数据投递下去即可
WeakReferenceLibPublisherWrapper
WeakReferenceLibPublisherWrapper
NTAudioRecordV2CallbackImpl(LibPublisherWrapper
WeakReference(publisher_1);}private
onNTAudioRecordV2Frame(ByteBuffer
per_channel_sample_number);LibPublisherWrapper
null)publisher_0.OnPCMData(data,
per_channel_sample_number);LibPublisherWrapper
null)publisher_1.OnPCMData(data,
WeakReferenceLibPublisherWrapper
PlayerVideoDataCallback(LibPublisherWrapper
WeakReference(publisher);}Overridepublic
video_buffer_;}video_buffer_size
ByteBuffer.allocateDirect(video_buffer_size);return
null)return;LibPublisherWrapper
(!publisher.is_publishing())return;video_buffer_.rewind();publisher.PostVideoEncodedData(video_codec_id,
从我发的Android平台RTSP转RTMP推送的demo界面可以看到这个demo不是单纯的RTSP转RTMP推送的还可以实现RTSP流获取后回调上来解码后的数据然后添加动态水印或其他处理后把video数据二次编码推送出去。
或者audio数据二次处理。
此外还可以实现拉流的数据预览播放、把数据注入到轻量级RTSP服务模块然后二次编码的数据本地录像、快照等。
一个好的RTSP转RTMP推送的模块一定要足够的灵活扩展性好才能很快的实现客户的技术诉求。
以上抛砖引玉感兴趣的开发者可以跟我单独探讨。
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback