首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用ffmpeg和c++发布自制的流到rtmp服务器?

如何用ffmpeg和c++发布自制的流到rtmp服务器?
EN

Stack Overflow用户
提问于 2013-03-01 03:21:17
回答 1查看 8.6K关注 0票数 2

祝你们愉快,各位!

我正在为Windows编写一个应用程序,将捕获屏幕,并通过rtmp发送流到Wowza服务器(用于广播)。我的应用程序使用ffmpeg和Qt。我使用WinApi捕获屏幕,将buffer转换为YUV444(因为它是最简单的),并按照文件decoding_encoding.c (来自FFmpeg示例)中的描述对帧进行编码:

代码语言:javascript
复制
///////////////////////////
//Encoder initialization
///////////////////////////
avcodec_register_all();
codec=avcodec_find_encoder(AV_CODEC_ID_H264);
c = avcodec_alloc_context3(codec);
c->width=scr_width;
c->height=scr_height;
c->bit_rate = 400000;
int base_num=1;
int base_den=1;//for one frame per second
c->time_base= (AVRational){base_num,base_den};
c->gop_size = 10;
c->max_b_frames=1;
c->pix_fmt = AV_PIX_FMT_YUV444P;
av_opt_set(c->priv_data, "preset", "slow", 0);

frame = avcodec_alloc_frame();
frame->format = c->pix_fmt;
frame->width  = c->width;
frame->height = c->height;

for(int counter=0;counter<10;counter++)
{
///////////////////////////
//Capturing Screen
///////////////////////////
    GetCapScr(shotbuf,scr_width,scr_height);//result: shotbuf is filled by screendata from HBITMAP
///////////////////////////
//Convert buffer to YUV444 (standard formula)
//It's handmade function because of problems with prepare buffer to swscale from HBITMAP
///////////////////////////
    RGBtoYUV(shotbuf,frame->linesize,frame->data,scr_width,scr_height);//result in frame->data
///////////////////////////
//Encode Screenshot
///////////////////////////
    av_init_packet(&pkt);
    pkt.data = NULL;    // packet data will be allocated by the encoder
    pkt.size = 0;
    frame->pts = counter;
    avcodec_encode_video2(c, &pkt, frame, &got_output);
    if (got_output) 
    {
        //I think that  sending packet by rtmp  must be here!
        av_free_packet(&pkt);             

    }

}
// Get the delayed frames
for (int got_output = 1,i=0; got_output; i++)
{
    ret = avcodec_encode_video2(c, &pkt, NULL, &got_output);
    if (ret < 0)
        {
            fprintf(stderr, "Error encoding frame\n");
            exit(1);
        }
        if (got_output)
        {
        //I think that  sending packet by rtmp  must be here!
        av_free_packet(&pkt);      
        }
}

///////////////////////////
//Deinitialize encoder
///////////////////////////
avcodec_close(c);
av_free(c);
av_freep(&frame->data[0]);
avcodec_free_frame(&frame);

我需要将此代码生成的视频流发送到RTMP服务器。换句话说,我需要c++/c模拟来执行这个命令:

代码语言:javascript
复制
ffmpeg -re -i "sample.h264" -f flv rtmp://sample.url.com/screen/test_stream

它很有用,但我不想将流保存到文件中,我想使用ffmpeg库来实时编码屏幕捕获并将编码帧发送到我自己应用程序中的RTMP服务器。请给我一个小例子如何正确初始化AVFormatContext和发送我的编码视频AVPackets到服务器。

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2013-03-04 00:32:29

我的问题可以通过使用ffmpeg源代码中的示例来解决。需要文件muxing.c。它位于ffmpeg源代码中的文件夹ffmpeg\docs\examples中。将样本流写入rtmp服务器或文件所需的源代码都有了。我只需要理解这些来源,并添加我自己的流数据,而不是样本流。可能会有意想不到的问题,但总的来说--有一个解决方案。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15143918

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档