使用X264和librtmp发送实时相机帧,但闪光灯无法显示

2024-03-25

我正在使用 X264 和 librtmp 发送我的实时相机帧,所有事情看起来都是正确的。但我的网络测试 Flash 无法显示正确的视频。有时它看起来是正确的,但是当我重新单击播放按钮时,闪光灯上没有显示任何图片。

这是我的 X264 配置代码

x264_param_default_preset(&x264param, "ultrafast", "zerolatency");
x264param.i_threads = 2;
x264param.i_width = width;
x264param.i_height = height;
x264param.i_log_level = X264_LOG_DEBUG;
x264param.i_fps_num = x264param.i_timebase_num= fps;
x264param.i_fps_den = x264param.i_timebase_den=1;
x264param.i_frame_total = 0;

x264param.i_frame_reference =1;
//x264param.i_frame_reference = 2;
x264param.i_keyint_min = 25;
x264param.i_keyint_max = fps*3;
x264param.i_scenecut_threshold = 40;

x264param.b_deblocking_filter = 1;
x264param.b_cabac = 0;
x264param.analyse.i_trellis = 0;
x264param.analyse.b_chroma_me = 1;

x264param.vui.i_sar_width = 0;
x264param.vui.i_sar_height = 0;
x264param.i_bframe_bias = 0;
x264param.b_interlaced= 0;
x264param.analyse.i_subpel_refine = 6; /* 0..5 -> 1..6 */
x264param.analyse.i_me_method = X264_ME_DIA;//X264_ME_HEX?X264_ME_DIA
x264param.analyse.i_me_range = 16;
x264param.analyse.i_direct_mv_pred = X264_DIRECT_PRED_AUTO;
x264param.i_deblocking_filter_alphac0 = 0;
x264param.i_deblocking_filter_beta = 0;
//x264param.analyse.intra = X264_ANALYSE_I4x4;
x264param.analyse.intra = X264_ANALYSE_I4x4;//  | X264_ANALYSE_PSUB16x16 | X264_ANALYSE_BSUB16x16;
x264param.analyse.inter = X264_ANALYSE_I4x4 | X264_ANALYSE_PSUB16x16 | X264_ANALYSE_BSUB16x16; 
//edit 2014-7-28
x264param.analyse.b_transform_8x8 = 1;
//x264param.analyse.b_transform_8x8 = 0;
x264param.analyse.b_fast_pskip = 1;
x264param.i_bframe = 0;
//x264param.b_intra_refresh
x264param.analyse.b_weighted_bipred = 0;

//// Intra refres:
x264param.i_keyint_max = 250;
x264param.b_intra_refresh = 0;
////Rate control:
//x264param.rc.i_rc_method = X264_RC_CRF;

//Rate Control
x264param.rc.f_ip_factor = 1.4f;
x264param.rc.f_pb_factor = 1.3f;
x264param.rc.f_qcompress = 1.0;
x264param.rc.i_qp_min = 20;//20;
x264param.rc.i_qp_max = 32;
x264param.rc.i_qp_step = 1;

switch (0)
{
case 0: /* 1 PASS ABR */
    x264param.rc.i_rc_method = X264_RC_ABR;
    x264param.rc.i_bitrate = 300; // max = 5000
    x264param.rc.b_mb_tree = 0;
    break;
case 1: /* 1 PASS CQ */
    x264param.rc.i_rc_method = X264_RC_CQP;
    x264param.rc.i_qp_constant = 26;//10 - 51
    break;
}

//For streaming:
x264param.b_repeat_headers = 1;
x264param.b_annexb = 1;
x264_param_apply_profile(&x264param, "baseline");
encoder = x264_encoder_open(&x264param);
x264_picture_init( &pic_in );
x264_picture_alloc(&pic_in, X264_CSP_I420, width, height);

pic_in.img.i_csp = X264_CSP_I420|X264_CSP_VFLIP;
pic_in.img.i_plane = 3;
pic_in.i_type = X264_TYPE_AUTO;

发送至 RTMP:

sws_scale(convertCtx,&a,&scribe,0,height, pic_in.img.plane, pic_in.img.i_stride);
int i_nal;
int i_frame_size = x264_encoder_encode( encoder, &nal, &i_nal, &pic_in, &pic_out );
if(i_frame_size <= 0){
    printf("\t!!!FAILED encode frame \n");
}else{
    for (int i = 0,last=0; i < i_nal;i++)  
    {
        fwrite(nal[i].p_payload, 1, i_frame_size-last, fpw1);
        if (nal[i].i_type == NAL_SPS) {
            sps_len = nal[i].i_payload-4;
            sps  = new unsigned char[sps_len];
            memcpy(sps,nal[i].p_payload+4,sps_len);
        } else if (nal[i].i_type == NAL_PPS) {
            pps_len = nal[i].i_payload-4;
            pps  = new unsigned char[sps_len];
            memcpy(pps,nal[i].p_payload+4,pps_len);
            send_video_sps_pps(); 
            free(sps);
            free(pps);
        } else {
            send_rtmp_video(nal[i].p_payload,i_frame_size-last);
            break;
        }
        last += nal[i].i_payload;
    }
}

发送 PPS 和 SPS

void send_video_sps_pps(){
if(rtmp!= NULL){
    RTMPPacket * packet;
    unsigned char * body;
    int i;

    packet = (RTMPPacket *)malloc(RTMP_HEAD_SIZE+1024);
    memset(packet,0,RTMP_HEAD_SIZE);

    packet->m_body = (char *)packet + RTMP_HEAD_SIZE;
    body = (unsigned char *)packet->m_body;
    i = 0;
    body[i++] = 0x17;
    body[i++] = 0x00;

    body[i++] = 0x00;
    body[i++] = 0x00;
    body[i++] = 0x00;

    /*AVCDecoderConfigurationRecord*/
    body[i++] = 0x01;
    body[i++] = sps[1];
    body[i++] = sps[2];
    body[i++] = sps[3];
    body[i++] = 0xff;

    /*sps*/
    body[i++]   = 0xe1;
    body[i++] = (sps_len >> 8) & 0xff;
    body[i++] = sps_len & 0xff;
    memcpy(&body[i],sps,sps_len);
    i +=  sps_len;

    /*pps*/
    body[i++]   = 0x01;
    body[i++] = (pps_len >> 8) & 0xff;
    body[i++] = (pps_len) & 0xff;
    memcpy(&body[i],pps,pps_len);
    i +=  pps_len;

    packet->m_packetType = RTMP_PACKET_TYPE_VIDEO;
    packet->m_nBodySize = i;
    packet->m_nChannel = 0x04;
    packet->m_nTimeStamp = 0;
    packet->m_hasAbsTimestamp = 0;
    packet->m_headerType = RTMP_PACKET_SIZE_MEDIUM;
    packet->m_nInfoField2 = rtmp->m_stream_id;

    RTMP_SendPacket(rtmp,packet,TRUE);
    free(packet);   
    rtmp_start_time = GetTickCount();
}else{
    std::cout<<"RTMP is not ready"<<std::endl;
}
}

发送视频帧

void send_rtmp_video(unsigned char * buf,int len){
RTMPPacket * packet;
long timeoffset = GetTickCount() - rtmp_start_time; 

int type = buf[0]&0x1f;

packet = (RTMPPacket *)malloc(RTMP_HEAD_SIZE+len+9);
memset(packet,0,RTMP_HEAD_SIZE);

packet->m_body = (char *)packet + RTMP_HEAD_SIZE;
packet->m_nBodySize = len + 9;

/*send video packet*/
unsigned char *body = (unsigned char *)packet->m_body;
memset(body,0,len+9);

/*key frame*/
body[0] = 0x27;
if (type == NAL_SLICE_IDR) {
    body[0] = 0x17;
}

body[1] = 0x01;   /*nal unit*/
body[2] = 0x00;
body[3] = 0x00;
body[4] = 0x00;

body[5] = (len >> 24) & 0xff;
body[6] = (len >> 16) & 0xff;
body[7] = (len >>  8) & 0xff;
body[8] = (len ) & 0xff;

/*copy data*/
memcpy(&body[9],buf,len);

packet->m_hasAbsTimestamp = 0;
packet->m_packetType = RTMP_PACKET_TYPE_VIDEO;
if(rtmp != NULL){
    packet->m_nInfoField2 = rtmp->m_stream_id;
}
packet->m_nChannel = 0x04;
packet->m_headerType = RTMP_PACKET_SIZE_LARGE;
packet->m_nTimeStamp = timeoffset;

if(rtmp != NULL){
    RTMP_SendPacket(rtmp,packet,TRUE);
}
free(packet);

}


尝试改变:

pps  = new unsigned char[sps_len];  

to:

pps  = new unsigned char[pps_len];
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用X264和librtmp发送实时相机帧,但闪光灯无法显示 的相关文章

  • ffmpeg推流rtmp指定udp传输

    RTMP Real Time Messaging Protocol 是一个用于音频 视频和数据的传输协议 RTMP 协议本身可以支持 TCP 或 UDP 作为其底层传输协议 在 RTMP 中 xff0c TCP 是默认的传输协议 xff0c
  • 【python】自动化ffmpeg推rtmp流 + 进程停止

    一 诉求 原因 xff1a ffmpeg命令可实现自动化推流 xff0c 一般在执行之后 xff0c 由于python的自上而下执行 xff0c 后续代码逻辑无法执行 场景1 xff1a 需要给两个rtmp地址轮询推流 xff0c 但希望视
  • Python进行ffmpeg推流和拉流rtsp、rtmp

    流媒体协议 xff0c 英文学名Streaming Protocol xff0c 用一句人话来解释 xff1a 流媒体协议是一种用于通过 Web 传递多媒体的协议 传统视频流协议 xff1a RTMP和RTSP xff0c 其中 RTMP
  • nginx+nginx-rtmp-module+ffmpeg搭建流媒体服务器服务器

    转载自 xff1a https mp weixin qq com s SGCoDd3 f4p YBIf7 nd1Q nginx 43 nginx rtmp module 43 ffmpeg搭建流媒体服务器服务器 txp玩Linux 昨天 前
  • RTMP协议封装H264和H265协议详解

    RTMP协议封装H264和H265协议详解 文章目录 RTMP协议封装H264和H265协议详解 1 RTMP和FLV 2 RTMP协议封装H264视频流 2 1 RTMP发送AVC sequence header 2 2 RTMP发送AV
  • OBS推流工具介绍及桌面录屏推流功能实现

    OBS推流工具介绍及桌面录屏推流功能实现 文章目录 OBS推流工具介绍及桌面录屏推流功能实现 1 OBS工具介绍 2 OBS工具安装及简单使用 2 1 安装步骤 2 2 简单使用介绍 3 OBS实现桌面录屏推流工具实现 4 总结 流媒体开发
  • vue-cli3.0实现播放rtmp直播流

    前言 用vue来实现播放rtmp 代码很简单 主要用的ckplayer 在使用过videojs video等其他插件以后 在播放视频直播流这里 觉得还是ckplayer比较给力 这里说下使用方法 实现效果 目录 实现步骤 一 下载ckpla
  • 使用vue-video-player,播放rtmp直播流

    可直接在新的页面复制使用 测试可用
  • Red5应用开发(三) 点播

    Red5点播默认只支持RTMP协议的点播地址 RTSP和HLS需要使用插件的形式进行配置 插件需要自己编译 很多依赖有问题 后期有需求再更新 Github 仓库地址 利用Red5的Eclipse插件生成的默认Red5工程即可直接作为点播应用
  • 安全的伪流 flv 文件

    We use RTMP通过 Wowza 保护流媒体内容 它就像一个魅力 Wowza 是一个真正强大且健壮的媒体服务器 可用于商业目的 但我们遇到了一个问题 这个问题对我们来说每天都在变得越来越大 许多新客户由于防火墙规则而无法使用RTMP
  • iOS 上通过 RTMP 的 H264 视频流

    经过一番挖掘 我发现了一个库 可以在写入 mp4 文件时从该文件中提取 NAL 单元 我正在尝试使用 RTMP 将此信息打包为 flvlibavformat and libavcodec 我使用以下方法设置视频流 void setupVid
  • 如何在android中的videoview中播放rtmp视频?

    我想在 videoview 中播放 rtmp 视频 那么如何在我的应用程序中播放 rtmp 视频 String host rtmp example com String fileName www mp4 int port 1935 Conn
  • ffmpeg 转换 x264 [错误]:大小为 769152 的 malloc 失败

    我正在尝试将从 Android 智能手表 mp4 格式 录制的视频转换为可在所有浏览器上播放的格式 mp4 从智能手表录制的视频未在浏览器中播放 所以 我使用 ffmpeg 将其转换为可播放的 mp4 格式 但有时它会显示错误x264 er
  • 使用 H.264 的 FFmpeg 流式传输(带音频) - Red5 媒体服务器(Ubuntu 操作系统)

    我正在尝试使用 RTMP 将带有 FFmpeg 的网络摄像头流式传输到我的 Red5 服务器 我已经使用 FLV 格式通过以下行成功完成了此操作 ffmpeg f video4linux2 i dev video0 f flv rtmp l
  • FFMPEG - 宽度/高度不能被 2 整除(缩放以生成 MBR 输出)

    我正在尝试在我的库中生成视频的多个变体 Mp4 格式 并计划呈现从 1080p 到 240p 以及介于两者之间的流行尺寸 为此 我正在拍摄具有 AxB 分辨率的视频 然后运行代码 在 bash 上 将它们缩放到所需的以下尺寸 426x240
  • RTMP中是如何包含flv格式的?

    我正在使用 Wireshark 来检查数据包 但我对 RTMP 流媒体中如何遵循 flv 格式感到困惑 FLV 文档指定标签为 标签类型 数据大小 时间戳 时间戳扩展 streamID VideoTagHeader 但我得到 fmt tim
  • 如何使用ffmpeg命令生成RTMP测试流?

    我想通过生成带有时间戳的 RTMP 测试视频来测试我的流媒体基础设施 这可能看起来像那样screen https s media cache ak0 pinimg com originals 65 25 9c 65259ca7ebaba59
  • iphone sdk 支持从 rtmp 流播放 mp4 吗?

    iphone sdk支持播放RTMP流中的mp4文件吗 我希望将文件存储在 CloudFront 中 在标记为流式传输的存储桶中 并希望 iPhone 应用程序能够播放它们 这可能吗 还是我最好将文件存储为 CloudFront 上的 mp
  • 使用 Clapprjs 在网页上流式传输 .m3u8

    我使用 nginx rtmp 将 rtmp 转换为 hls 并使用 Clappr 在网页中进行流式传输 但 Clappr 采用旧的 ts 段 导致 404 错误 因为它在服务器上被删除 如何解决这个问题 抱歉 这是我第一次使用 nginx
  • 使用 libx264 为 Raspberry pi 编译 Xuggler 时的问题 #2

    我正在尝试编译Xuggler http www xuggle com xuggler 对于 Raspberry Pi 在 Debian 操作系统上运行 又名 Raspbian 我遵循了可用的 基本构建说明 here http www xug

随机推荐

  • 如何解释 Seaborn distplot 的轴

    Snippet plt figure figsize 10 5 plt xticks np arange 0 11 1 sns distplot 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 kde F
  • 如何增加LVL缓存有效时间?

    我已经在我的应用程序中实施了 LVL 服务器托管策略 我知道lvl服务器响应会在设备中缓存一段时间 因此用户可以在没有互联网连接的情况下使用应用程序 然后lvl使用缓存的许可证 我想知道这个期限到底有多长以及如何延长它 基本上 lvl 我已
  • 用于在不同工作簿中选择范围的 VBA 对话框

    我想允许用户选择可能位于不同工作簿中的范围 我尝试使用 inputbox type 8 来执行此操作 它可以选择工作簿中的数据 但不允许我在不同的工作簿中选择范围 因此我想要一个允许我执行此任务的对话框 由于我有空 我为您创建了一个示例 创
  • .JSchException:数据包损坏

    我在 RHEl 6 上使用 Jsch 0 1 51 和 Jdk 1 7 51 在与远程计算机进行会话时 我收到以下异常 com jcraft jsch JSchException Packet corrupt at com jcraft j
  • Python venv env 失败 - [WinError 2] 系统找不到指定的文件

    我在 Windows 10 计算机上安装了最新版本的 Python 3 8 2 我以前有Python 3 7 我将其卸载并确认在系统路径中不再引用它 安装最新版本后 我以管理员身份运行CMD py m venv env 我收到此错误 错误
  • 添加到Python中正在迭代的双端队列?

    我在 Python 中有一个双端队列 正在对其进行迭代 有时 当我进行交互时 双端队列会发生变化 从而产生RuntimeError deque mutated during iteration 如果这是一个 Python 列表而不是双端队列
  • 如何部署Tomcat的示例websocket应用程序?

    我正在尝试了解如何部署 Apache Tomcat 7 中引用的示例WebSocket 操作方法 http tomcat apache org tomcat 7 0 doc web socket howto html page 应用程序开发
  • 根据室外温度设置背景颜色

    嘿哦 所以 我有一个温度小部件要在我正在进行的项目上实现 没有什么特别困难的 我有一个免费的 API 来检索我需要的数据等 但是 和我一起工作的可爱设计师有一个颜色特征 我对此一无所知 他会根据当前的天气温度来定义背景颜色 我的意思是如果温
  • 在 ReactJS 中禁用 ContextMenu

    第一篇文章在这里 所以希望我能以最有帮助的方式提出这个问题 我对编码还很陌生 在努力推动自己的过程中 我决定尝试使用 React 来重新创建扫雷 而不是使用任何教程 我已经获得了很多功能 但我真的停留在这部分上 我正在使用事件侦听器 onC
  • 如何快速本地化故事板?

    我正在尝试使用 Swift 3 和 Xcode 8 1 本地化我的应用程序 我正在尝试使用 Storyboard main strings German 并以编程方式使用来本地化应用程序 NSLocalizedString 我能够使用编程方
  • 如何从多个网站获取 RSS 源

    我正在为我的网站获取 RssFeeds 并且它正在显示 但是如何从多个站点获取 RSS Feed 并且需要从第一个站点的三个 feed 第二个站点的三个 feed 等依次显示 主要来自 CNN BBC 这是我的代码 protected vo
  • 如何使用 asp.net 和 C# 强制回发

    我与客户安排了一个演示 现在我需要一个快速而肮脏的修复 明天我会找到更合适的解决方案 但目前我需要一种方法来强制回发或刷新页面 我试过 Response Redirect 但它带我到一个页面 上面写着 对象已移至此处 这里 是一个超链接 可
  • Cabal - 在构建库时公开所有模块

    是否可以告诉Cabal在构建库时公开所有模块 现在我必须提供很长的模块列表exposed modulescabal 配置文件部分 您必须列出 cabal 配置文件中的所有模块 在你的情况下 你只需将模块列表放在后面exposed modul
  • 将列表设置为 pandas 数据帧的列中的值

    假设我有一个数据框df我想创建一个填充 0 的新列 我使用 df new col 0 到目前为止 没有问题 但如果我想使用的值是一个列表 它就不起作用 df new col my list ValueError Length of valu
  • jQuery 在选择框上设置选项

    我似乎无法让这个工作
  • 为什么 String.equals() 比它本身快?

    我试图创建一个更快的版本字符串 equals http docs oracle com javase 7 docs api java lang String html equals 28java lang Object 29方法并从简单地复
  • 如何使用plot_grid在没有任何空间的情况下放置绘图?

    我正在做 2x2 地块的排列 这些图共享相同的轴 所以我想将它们放在一起 例如 这段代码 library ggplot2 library cowplot Value lt seq 0 1000 by 1000 10 Index lt 0 1
  • 如何自托管 ASP.NET 5 MVC6 应用程序

    刚刚开始学习 ASP NET 5 MVC 6 我很好奇在 IIS 之外自托管这样一个应用程序 作为 Windows 服务 我应该使用 TopShelf 来实现这一点 就像 OWIN Katana 应用程序的情况一样 还是 ASP NET 5
  • 使用护照进行 Node.js 用户身份验证

    使用序列化函数更新了代码 仍然重定向到 failedRedirect 我试图使用护照包进行简单的用户名 密码身份验证 但失败了 在下面的示例中 我尝试通过基本上始终返回有效的身份验证 无论通过什么 来验证身份验证是否有效 但由于某种原因它失
  • 使用X264和librtmp发送实时相机帧,但闪光灯无法显示

    我正在使用 X264 和 librtmp 发送我的实时相机帧 所有事情看起来都是正确的 但我的网络测试 Flash 无法显示正确的视频 有时它看起来是正确的 但是当我重新单击播放按钮时 闪光灯上没有显示任何图片 这是我的 X264 配置代码