zoukankan      html  css  js  c++  java
  • RTMP读流和推流实验

    1、打开rtmp读流地址:

     1    const char* filename ="rtmp://live.hkstv.hk.lxdns.com/live/hks
     2     int ret;
     3     if ((ret = avformat_open_input(&pFormatCtx, filename, NULL, NULL)) < 0)
     4     {
     5         abort();
     6     }
     7 
     8     videoStreamIndex = 0;
     9 
    10     if ((ret = avformat_find_stream_info(pFormatCtx, 0)) < 0)
    11     {
    12         abort();
    13     }
    14 
    15     //解码视频
    16     pCodeCtx = pFormatCtx->streams[videoStreamIndex]->codec;
    17 
    18     //获取解码器   
    19     pCodec = avcodec_find_decoder(pCodeCtx->codec_id);
    20     if (pCodec == NULL)
    21     {
    22         abort();
    23     }
    24     if (pCodec->capabilities & CODEC_CAP_TRUNCATED)
    25     {
    26         pCodeCtx->flags |= CODEC_FLAG_TRUNCATED;
    27     }
    28     if (avcodec_open2(pCodeCtx, pCodec, NULL) < 0)
    29     {
    30         abort();
    31     } 

    2、打开rtmp推流地址

     1 const char* out_file = "rtmp://live-push.meidou.d3dstore.com/live/200446?tm=20160907155557&sign=30f1877d6fab32de9a555f1285c7e1ed";
     2     in_w = 1776;
     3     in_h = 888;
     4     avformat_alloc_output_context2(&ppFormatCtx, NULL, "flv", out_file);
     5     ppCodec = avcodec_find_encoder(AV_CODEC_ID_H264);
     6 
     7     if (!ppCodec)
     8     {
     9         //printf("Can not find encoder! 
    ");
    10         //return;
    11         AfxMessageBox("Can not find encoder!");
    12         return;
    13     }
    14     pCodecCtx = avcodec_alloc_context3(ppCodec);
    15     pCodecCtx->pix_fmt = PIX_FMT_YUV420P;
    16     pCodecCtx->width = in_w;
    17     pCodecCtx->height = in_h;
    18     pCodecCtx->time_base.num = 1;
    19     pCodecCtx->time_base.den = 20;// 25;// 25;
    20     pCodecCtx->bit_rate = 2000000;// 400000;
    21     pCodecCtx->gop_size = 500;// 250;
    22     pCodecCtx->qcompress = 0.6;
    23     
    24     pCodecCtx->thread_count = 4;//将帧分块,由不同的进程分别编码,0 for auto
    25 
    26 
    27 
    28     if (ppFormatCtx->oformat->flags & AVFMT_GLOBALHEADER)
    29         pCodecCtx->flags |= CODEC_FLAG_GLOBAL_HEADER;
    30 
    31     //H264 codec param
    32     pCodecCtx->me_range = 16;
    33     pCodecCtx->max_qdiff = 4;
    34     //pCodecCtx->qcompress = 0.6;
    35     pCodecCtx->qmin = 10;
    36     pCodecCtx->qmax = 23;// 20;// 51;//编码质量,值越大,质量越差,最差为51
    37     //Optional Param
    38     pCodecCtx->max_b_frames = 3;
    39     // Set H264 preset and tune
    40     AVDictionary *param = 0;
    41     av_dict_set(&param, "preset", "fast", 0);
    42     av_dict_set(&param, "tune", "zerolatency", 0);
    43 
    44     if (avcodec_open2(pCodecCtx, ppCodec, &param) < 0)
    45     {
    46         //printf("Failed to open encoder! 
    ");
    47         AfxMessageBox("Failed to open encoder!");
    48         return;
    49 
    50     }
  • 相关阅读:
    String和StringBuffer相关
    ReactNative 2018了解一下
    发送验证码倒计时效果
    图片实际尺寸大小
    ES6(一)
    组件开发之选项卡-2
    (function(){代码})()自执行函数
    Vue组件学习之三
    Vue下拉菜单实例demo
    窗口大小左右拖动demo
  • 原文地址:https://www.cnblogs.com/taotaoland/p/5850100.html
Copyright © 2011-2022 走看看