2013-02-28 2 views
0

Приятного вам дня, люди!Как публиковать самодельный поток с серверами ffmpeg и C++ на rtmp?

Я пишу приложение для Windows, которое будет захватывать экран и отправлять поток на сервер Wowza по rtmp (для трансляции). В моем приложении используются ffmpeg и Qt. Я захватить экран с WinApi, преобразовать буфер YUV444 (потому что это самый простой) и кодировать кадр, как описано в файле decoding_encoding.c (из примеров FFmpeg):

/////////////////////////// 
//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 аналог этой команды:

ffmpeg -re -i "sample.h264" -f flv rtmp://sample.url.com/screen/test_stream 

Это полезно, но я не хочу, чтобы сохранить поток в файл, я хочу использовать FFmpeg библиотеки для кодирования в реальном времени захвата экрана и отправки закодированные кадры на RTMP-сервер внутри моего собственного приложения. Пожалуйста, дайте мне небольшой пример того, как правильно инициализировать AVFormatContext и отправить мои кодированные видео AVPackets на сервер.

Спасибо.

ответ

5

. Моя проблема может быть решена с использованием примера из источника ffmpeg. Файл muxing.c необходим. Он находится в папке ffmpeg\docs\examples в источниках ffmpeg. Есть все необходимые исходные коды для записи потока примеров в сервер или файл rtmp. Я должен только понимать эти источники и добавлять свои собственные данные потока вместо потока образца. Возможны неожиданные проблемы, но в целом - есть решение.

+0

Вы нашли рабочее решение? – Sebastian

 Смежные вопросы

  • Нет связанных вопросов^_^