当前位置: 首页 > news >正文

手机站模板网站内搜索关键字

手机站模板,网站内搜索关键字,网页设计实训报告总结1500字,vi设计获奖作品技术背景 无论是Windows平台还是Linux#xff0c;多路播放诉求非常普遍#xff0c;比如针对智慧工地、展馆、教育等宏观场景下的摄像头展示#xff0c;关于RTSP或RTMP直播播放器开发需要注意的点#xff0c;可参考之前博客#xff0c;总的来说有以下一些点#xff1a; …技术背景 无论是Windows平台还是Linux多路播放诉求非常普遍比如针对智慧工地、展馆、教育等宏观场景下的摄像头展示关于RTSP或RTMP直播播放器开发需要注意的点可参考之前博客总的来说有以下一些点 1. 低延迟大多数RTSP的播放都面向直播场景所以如果延迟过大比如监控行业小偷都走了客户端才看到或者别人已经按过门铃几秒主人才看到图像严重影响体验所以低延迟是衡量一个好的RTSP播放器非常重要的指标目前大牛直播SDK的RTSP播放延迟控制在几百毫秒VLC在几秒这个延迟是长时间的低延迟比如运行1天、一周、一个月甚至更久 2. 音视频同步或跳转有些开发者为了追求低延迟体验甚至不做音视频同步拿到audio video直接播放导致a/v不同步还有就是时间戳乱跳 3. 支持多实例一个好的播放器需要支持同时播放多路音视频数据比如4-8-9-16-32窗口 4. 支持buffer time设置在一些有网络抖动的场景播放器需要支持精准的buffer time设置一般来说以毫秒计 5. H.265的播放和录制除了H.264还需要支持H.265目前市面上的RTSP H.265摄像头越来越多支持H.265的RTSP播放器迫在眉睫此外单纯的播放H.265还不够还需要可以能把H.265的数据能录制下来 6. TCP/UDP模式切换考虑到好多服务器仅支持TCP或UDP模式一个好的RTSP播放器需要支持TCP/UDP模式自动切换 7. 静音支持比如多窗口播放RTSP流如果每个audio都播放出来体验非常不好所以实时静音功能非常必要 8. 视频view旋转好多摄像头由于安装限制导致图像倒置所以一个好的RTSP播放器应该支持如视频view实时旋转(0° 90° 180° 270°)、水平反转、垂直反转 9. 支持解码后audio/video数据输出可选大牛直播SDK接触到好多开发者希望能在播放的同时获取到YUV或RGB数据进行人脸匹配等算法分析所以音视频回调可选 10. 快照感兴趣或重要的画面实时截取下来非常必要 11. 网络抖动处理(如断网重连)基本功能不再赘述 12. 跨平台一个好的播放器跨平台Windows/Android/iOS很有必要起码为了后续扩展性考虑开发的时候有这方面的考虑目前大牛直播SDK的RTSP播放器完美支持以上平台 13. 长期运行稳定性提到稳定性好多开发者不以为然实际上一个好的产品稳定是最基本的前提不容忽视14. 可以录像播放的过程中随时录制下来感兴趣的视频片断存档或其他二次处理 15. log信息记录整体流程机制实时反馈不多打log但是不能一些重要的log如播放过程中出错等 16. download速度实时反馈可以看到实时下载速度反馈以此来监听网络状态 17. 异常状态处理如播放的过程中断网、网络抖动、来电话、切后台后返回等各种场景的处理。 代码实现 本文以大牛直播SDK官方的Linux平台为例介绍下RTMP或RTSP流多路播放集成。 int main(int argc, char *argv[]) {XInitThreads(); // X支持多线程, 必须调用NT_SDKLogInit();// SDK初始化SmartPlayerSDKAPI player_api;if (!NT_PlayerSDKInit(player_api)){fprintf(stderr, SDK init failed.\n);return 0;}auto display XOpenDisplay(nullptr);if (!display){fprintf(stderr, Cannot connect to X server\n);player_api.UnInit();return 0;}auto screen DefaultScreen(display);auto root XRootWindow(display, screen);XWindowAttributes root_win_att;if (!XGetWindowAttributes(display, root, root_win_att)){fprintf(stderr, Get Root window attri failed\n);player_api.UnInit();XCloseDisplay(display);return 0;}if (root_win_att.width 100 || root_win_att.height 100){fprintf(stderr, Root window size error.\n);player_api.UnInit();XCloseDisplay(display);return 0;}fprintf(stdout, Root Window Size:%d*%d\n, root_win_att.width, root_win_att.height);int main_w root_win_att.width / 2, main_h root_win_att.height/2;auto black_pixel BlackPixel(display, screen);auto white_pixel WhitePixel(display, screen);auto main_wid XCreateSimpleWindow(display, root, 0, 0, main_w, main_h, 0, white_pixel, black_pixel);if (!main_wid){player_api.UnInit();XCloseDisplay(display);fprintf(stderr, Cannot create main windows\n);return 0;}XSelectInput(display, main_wid, StructureNotifyMask | KeyPressMask);XMapWindow(display, main_wid);XStoreName(display, main_wid, win_base_title);std::vectorstd::shared_ptrNT_PlayerSDKWrapper players;for (auto url: players_url_){auto i std::make_sharedNT_PlayerSDKWrapper(player_api);i-SetDisplay(display);i-SetScreen(screen);i-SetURL(url);players.push_back(i);if ( players.size() 3 )break;}auto border_w 2;std::vectorNT_LayoutRect layout_rects;SubWindowsLayout(main_w, main_h, border_w, static_castint(players.size()), layout_rects);for (auto i 0; i static_castint(players.size()); i){assert(players[i]);players[i]-SetWindow(CreateSubWindow(display, screen, main_wid, layout_rects[i], border_w));}for (const auto i : players){assert(i);if (i-GetWindow())XMapWindow(display, i-GetWindow());}for (auto i 0; i static_castint(players.size()); i){assert(players[i]);// 第一路不静音, 其他全部静音players[i]-Start(0, i!0, 1, false);//players[i]-Start(0, false, 1, false);}while (true){while (MY_X11_Pending(display, 10)){XEvent xev;memset(xev, 0, sizeof(xev));XNextEvent(display, xev);if (xev.type ConfigureNotify){if (xev.xconfigure.window main_wid){if (xev.xconfigure.width ! main_w || xev.xconfigure.height ! main_h){main_w xev.xconfigure.width;main_h xev.xconfigure.height;SubWindowsLayout(main_w, main_h, border_w, static_castint(players.size()), layout_rects);for (auto i 0; i static_castint(players.size()); i){if (players[i]-GetWindow()){XMoveResizeWindow(display, players[i]-GetWindow(), layout_rects[i].x_, layout_rects[i].y_, layout_rects[i].w_, layout_rects[i].h_);}}}}else{for (const auto i: players){assert(i);if (i-GetWindow() i-GetWindow() xev.xconfigure.window){i-OnWindowSize(xev.xconfigure.width, xev.xconfigure.height);}}}}else if (xev.type KeyPress){if (xev.xkey.keycode XKeysymToKeycode(display, XK_Escape)){fprintf(stdout, ESC Key Press\n);for (const auto i : players){i-Stop();if (i-GetWindow()){XDestroyWindow(display, i-GetWindow());i-SetWindow(None);}}players.clear();XDestroyWindow(display, main_wid);XCloseDisplay(display);player_api.UnInit();fprintf(stdout, Close Players....\n);return 0;}}}} } 开始播放封装 bool NT_PlayerSDKWrapper::Start(int buffer, bool is_mute, int render_scale_mode, bool is_only_dec_key_frame) {if (is_playing_)return false;if (url_.empty())return false;if (!OpenHandle(url_, buffer))return false;assert(handle_ handle_-Handle());// 音频参数player_api_-SetMute(handle_-Handle(), is_mute ? 1 : 0);player_api_-SetIsOutputAudioDevice(handle_-Handle(), 1);player_api_-SetAudioOutputLayer(handle_-Handle(), 0); // 使用pluse 或者 alsa播放, 两个可以选择一个// 视频参数player_api_-SetVideoSizeCallBack(handle_-Handle(), this, NT_Player_SDK_WRAPPER_OnVideoSizeHandle);player_api_-SetXDisplay(handle_-Handle(), display_);player_api_-SetXScreenNumber(handle_-Handle(),screen_);player_api_-SetRenderXWindow(handle_-Handle(), window_);player_api_-SetRenderScaleMode(handle_-Handle(), render_scale_mode);player_api_-SetRenderTextureScaleFilterMode(handle_-Handle(), 3);player_api_-SetOnlyDecodeVideoKeyFrame(handle_-Handle(), is_only_dec_key_frame ? 1 : 0);auto ret player_api_-StartPlay(handle_-Handle());if (NT_ERC_OK ! ret){ResetHandle();return false;}is_playing_ true;return true; }停止播放 void NT_PlayerSDKWrapper::Stop() {if (!is_playing_)return;assert(handle_);player_api_-StopPlay(handle_-Handle());video_width_ 0;video_height_ 0;ResetHandle();is_playing_ false; }视频宽高回调 extern C NT_VOID NT_CALLBACK NT_Player_SDK_WRAPPER_OnVideoSizeHandle(NT_HANDLE handle, NT_PVOID user_data,NT_INT32 width, NT_INT32 height) {auto sdk_wrapper reinterpret_castNT_PlayerSDKWrapper*(user_data);if (nullptr sdk_wrapper)return;sdk_wrapper-VideoSizeHandle(handle, width, height); } 实时快照 extern C NT_VOID NT_CALLBACK NT_Player_SDK_WRAPPER_OnCaptureImageCallBack(NT_HANDLE handle, NT_PVOID user_data, NT_UINT32 result, NT_PCSTR file_name) {auto sdk_wrapper reinterpret_castNT_PlayerSDKWrapper*(user_data);if (nullptr sdk_wrapper)return;sdk_wrapper-CaptureImageHandle(handle, result, file_name); }实时静音 void NT_PlayerSDKWrapper::SetMute(bool is_mute) {if (is_playing_ handle_){player_api_-SetMute(handle_-Handle(), is_mute?1:0);} } 设置绘制模式 void NT_PlayerSDKWrapper::SetRenderScaleMode(int render_scale_mode) {if (is_playing_ handle_){player_api_-SetRenderScaleMode(handle_-Handle(), render_scale_mode);} } 设置只解关键帧 void NT_PlayerSDKWrapper::SetOnlyDecodeVideoKeyFrame(bool is_only_dec_key_frame) {if (is_playing_ handle_){player_api_-SetOnlyDecodeVideoKeyFrame(handle_-Handle(), is_only_dec_key_frame ? 1 : 0);} } Handler管理 bool NT_PlayerSDKWrapper::OpenHandle(const std::string url, int buffer) {if (handle_){if (handle_-IsOpened() handle_-URL() url){return true;}}ResetHandle();auto handle std::make_sharedNT_SDK_HandleWrapper(player_api_);if (!handle-Open(url, buffer)){return false;}handle_ handle;handle_-AddEventHandler(shared_from_this());return true; }void NT_PlayerSDKWrapper::ResetHandle() {if (handle_){handle_-RemoveHandler(this);handle_.reset();} }录像等其他接口不再赘述可Windows平台一致。 总结 多路RTMP或RTSP播放涉及到性能和多路之间音视频同步、长时间播放稳定性等问题Linux平台可参考的资料比较少可选的方案比较少感兴趣的可酌情参考。
http://www.yutouwan.com/news/212333/

相关文章:

  • 建网站 绑定域名 网址怎样做网站吸引人
  • 莆田外贸建站关键词优化举例
  • 如何在局域网中做网站镇江发布的最新消息
  • 网站推广开户设置wordpress文章图片不显示
  • icp备案查询站长工具团员电子档案查询系统
  • 易企网络网站建设湖南 网站备案
  • 免费建网站 手机网站图片生成二维码在线制作
  • 商务网站建设平台企业网站建设与推广多少钱
  • 河西做网站的公司网站建设相关的博客有哪些
  • 权威做网站的公司微信扫码登记小程序
  • 汽修网站怎么做冯耀宗seo视频教程
  • 网站维护是不是很难做今天济南刚刚发生的新闻
  • 图片网站收录tradekey外贸平台官网
  • 建设银行北京分行网站邯郸建设局网站资质申报
  • 网站建设新闻中心呼和浩特网站推广公司
  • 免费cms建站系统有哪些学院网站设计模板
  • 福州seo推广优化杭州百度人工优化
  • 工信部网站 备案时间dtcms网站开发教程
  • 做电子商务网站免费的行情网站ifind是
  • 宁波市住房与城乡建设部网站如何零基础做网站
  • 网页设计公司建网站网站设计苏州公司网站建设找哪家
  • 网站建设晋icp备如何做亚马逊备案的网站
  • 腾讯空间个人认证 企业认证 网站认证哪种功能用途最齐全??游戏软件开发流程
  • 山东淄博网站建设微信公众号网站建设费
  • 注册的网站医疗网站咨询源码
  • 舟山建设网站公司微信小程序怎么关闭防沉迷
  • 十堰微网站建设多少钱网页设计模板html代码用户评论
  • 做票据业务的p2p网站北京网站建设公司分享网站改版注意事项
  • 内蒙古住房和城乡建设厅网站 工程建设管理把做的网站发布打万维网上
  • 企业网站seo方案最近军事新闻大事