출처: http://bluexmas.tistory.com/273



ffmpeg - rtmp sample 테스트

Programming/C++ 2012.05.25 17:19 Posted by 파란크리스마스

출처 : RTMPDump
Compiling RTMPdump on Max OS X
Compiling FFmpeg 0.9 with libRTMP and libmp3lame for Intel and ARM CPUs
Compiling FFMPEG 0.6 with RTMP Support for OSX 
ffmpeg ndk 빌드 #2 ffmpeg 옵션별 빌드
best-video-player
Fix rtmp double cflags in pkgconfig module

다운로드

RTMPDump 에서 rtmpdump-2.3.tgz 파일 다운로드

압축풀기

tar xvfz rtmpdump-2.3.gz

ffmpeg 폴더로 이동 시키기

mv rtmpdump-2.3/librtmp ffmpeg-0.10.3

rtmp 라이브러리 컴파일, 설치

cd ffmpeg-0.10.3/librtmp
make SYS=linux install
echo 'export PKG_CONFIG_PATH=/lib/pkgconfig:/usr/local/lib/pkgconfig' | tee -a ~/.bashrc

configure

config.sh 파일

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
export TMPDIR=c:/ffmpegtmp
 
./configure --disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-avdevice \
--disable-devices \
--disable-filters \
--disable-yasm \
--enable-network \
--enable-protocol=tcp \
--enable-demuxer=rtsp \
--enable-decoder=h264 \
--enable-librtmp

./config.sh

make

testmain.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <stdio.h>
#include <stdlib.h>
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libavformat/avio.h>
  
  
int main(int argc, char** argv) {
  
    AVFormatContext* context = avformat_alloc_context();
    int video_stream_index;
  
    av_register_all();
    avcodec_register_all();
    avformat_network_init();
 
    //if(avformat_open_input(&context, "rtsp://192.168.0.40/vod/mp4:sample.mp4",NULL,NULL) != 0){
    //if(avformat_open_input(&context, "rtmp://192.168.0.40/vod/sample.mp4",NULL,NULL) != 0){      
    //if(avformat_open_input(&context, "d:\\windows\\b.mp4",NULL,NULL) != 0){
  
    //open rtsp
    if(avformat_open_input(&context, "rtmp://192.168.0.40/vod/sample.mp4",NULL,NULL) != 0){        
        return EXIT_FAILURE;
    }
  
    if(avformat_find_stream_info(context,NULL) < 0){
        return EXIT_FAILURE;
    }
  
    //search video stream
    int i;
    for(i =0;i<context->nb_streams;i++){
        if(context->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO)
            video_stream_index = i;
    }
  
    AVPacket packet;
    av_init_packet(&packet);
  
    //open output file
    AVOutputFormat* fmt = av_guess_format(NULL,"test2.avi",NULL);
    AVFormatContext* oc = avformat_alloc_context();
    oc->oformat = fmt;
    avio_open2(&oc->pb, "test.avi", AVIO_FLAG_WRITE,NULL,NULL);
  
    AVStream* stream=NULL;
    int cnt = 0;
    //start reading packets from stream and write them to file
  
    av_read_play(context);//play RTSP
    while(av_read_frame(context,&packet)>=0 && cnt <100){//read 100 frames
        if(packet.stream_index == video_stream_index){//packet is video               
            if(stream == NULL){//create stream in file
                stream = avformat_new_stream(oc,context->streams[video_stream_index]->codec->codec);
                avcodec_copy_context(stream->codec,context->streams[video_stream_index]->codec);
                stream->sample_aspect_ratio = context->streams[video_stream_index]->codec->sample_aspect_ratio;
                avformat_write_header(oc,NULL);
            }
            packet.stream_index = stream->id;
  
            av_write_frame(oc,&packet);
            cnt++;
        }
        av_free_packet(&packet);
        av_init_packet(&packet);
    }
    av_read_pause(context);
    av_write_trailer(oc);
    avio_close(oc->pb);
    avformat_free_context(oc);
  
    return (EXIT_SUCCESS);
}

Makefile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
TARGET = hello3
 
FFMPEGDIR = /home/bluesanta/ffmpeg-0.10.3
 
LIBDIR = /lib
 
CC  = gcc
AR  = ar
LD  = ld
NM  = nm
RANLIB  = ranlib
STRIP = strip
 
INCLUDE = -I.. -I.
 
CFLAGS = -Wall
LDFFMPEG = -L$(FFMPEGDIR)/libavformat -L$(FFMPEGDIR)/libavcodec -L$(FFMPEGDIR)/libavutil -L$(FFMPEGDIR)/librtmp
LDFLAGS = -L$(LIBDIR) $(LDFFMPEG) -lavformat -lavcodec -lavutil -lrtmp -lkernel32 -lcygwin -lm -lgcc -lc -lssl -lz -lcrypto
 
# application file
APPSOURCES = testmain.c
APPOBJS = $(APPSOURCES:.c=.o)
 
# define the rule
.SUFFIXES:.c .o
 
.c.o:
    @echo Compiling: $<
    $(CC) -c $(CFLAGS)  $(INCLUDE) -o $@ $<
 
all: app
 
app: $(APPOBJS)
    @echo Linking: $(TARGET)
    $(CC) -o $(TARGET) $(APPOBJS) $(LDFLAGS)
    $(STRIP) -s $(TARGET)
 
clean:
    @rm -vf $(APPOBJS) $(TARGET)

컴파일, 실행

 


'Programming > C++' 카테고리의 다른 글

av_free_packet 예제들  (0) 2016.03.27
[펌] How to: Debug from a DLL Project  (0) 2016.03.26
[펌] pragma에 관한 사용법  (0) 2016.03.07
Posted by 세모아
,