ortp 라이브러리 이용방법 질문좀 드릴게요~~

pogusm의 이미지

http://download.savannah.gnu.org/releases/linphone/ortp/sources/ortp-0.20.0.tar.gz
위 라이브러리를 이용해서, [마이크입력----> rtp -----> 스피커출력] 을 해보고 싶은데
초보라서 도움이 필요합니다. ㅠㅠ (win7, QT c++)

아래의 소스코드는 ortp-0.20.0/src/tests/ 에 위치한 샘플소스코드 입니다.

// rtpsend.c
 
#include <ortp/ortp.h>
#include <signal.h>
#include <stdlib.h>
 
#ifndef _WIN32 
#include <sys/types.h>
#include <sys/time.h>
#include <stdio.h>
#endif
 
int runcond=1;
 
void stophandler(int signum)
{
	runcond=0;
}
 
static const char *help="usage: rtpsend	filename dest_ip4addr dest_port [ --with-clockslide <value> ] [ --with-jitter <milliseconds>]\n";
 
int main(int argc, char *argv[])
{
	RtpSession *session;
	unsigned char buffer[160];
	int i;
	FILE *infile;
	char *ssrc;
	uint32_t user_ts=0;
	int clockslide=0;
	int jitter=0;
	if (argc<4){
		printf("%s", help);
		return -1;
	}
	for(i=4;i<argc;i++){
		if (strcmp(argv[i],"--with-clockslide")==0){
			i++;
			if (i>=argc) {
				printf("%s", help);
				return -1;
			}
			clockslide=atoi(argv[i]);
			ortp_message("Using clockslide of %i milisecond every 50 packets.",clockslide);
		}else if (strcmp(argv[i],"--with-jitter")==0){
			ortp_message("Jitter will be added to outgoing stream.");
			i++;
			if (i>=argc) {
				printf("%s", help);
				return -1;
			}
			jitter=atoi(argv[i]);
		}
	}
 
	ortp_init();
	ortp_scheduler_init();
	ortp_set_log_level_mask(ORTP_MESSAGE|ORTP_WARNING|ORTP_ERROR);
	session=rtp_session_new(RTP_SESSION_SENDONLY);	
 
	rtp_session_set_scheduling_mode(session,1);
	rtp_session_set_blocking_mode(session,1);
	rtp_session_set_connected_mode(session,TRUE);
	rtp_session_set_remote_addr(session,argv[2],atoi(argv[3]));
	rtp_session_set_payload_type(session,0);
 
	ssrc=getenv("SSRC");
	if (ssrc!=NULL) {
		printf("using SSRC=%i.\n",atoi(ssrc));
		rtp_session_set_ssrc(session,atoi(ssrc));
	}
 
	#ifndef _WIN32
	infile=fopen(argv[1],"r");
	#else
	infile=fopen(argv[1],"rb");
	#endif
 
	if (infile==NULL) {
		perror("Cannot open file");
		return -1;
	}
 
	signal(SIGINT,stophandler);
	while( ((i=fread(buffer,1,160,infile))>0) && (runcond) )
	{
		rtp_session_send_with_ts(session,buffer,i,user_ts);
		user_ts+=160;
		if (clockslide!=0 && user_ts%(160*50)==0){
			ortp_message("Clock sliding of %i miliseconds now",clockslide);
			rtp_session_make_time_distorsion(session,clockslide);
		}
		/*this will simulate a burst of late packets */
		if (jitter && (user_ts%(8000)==0)) {
			struct timespec pausetime, remtime;
			ortp_message("Simulating late packets now (%i milliseconds)",jitter);
			pausetime.tv_sec=jitter/1000;
			pausetime.tv_nsec=(jitter%1000)*1000000;
			while(nanosleep(&pausetime,&remtime)==-1 && errno==EINTR){
				pausetime=remtime;
			}
		}
	}
 
	fclose(infile);
	rtp_session_destroy(session);
	ortp_exit();
	ortp_global_stats_display();
 
	return 0;
}

아래의 소스코드는, QT에 포함되어 있는 audioinput 예제소스코드의 일부입니다.(간략) (파일첨부) (\Qt\4.8.0\examples\multimedia\)

void InputTest::initializeAudio()
{
    m_pullMode = true;
 
    m_format.setFrequency(8000);
    m_format.setChannels(1);
    m_format.setSampleSize(16);
    m_format.setSampleType(QAudioFormat::SignedInt);
    m_format.setByteOrder(QAudioFormat::LittleEndian);
    m_format.setCodec("audio/pcm");
 
    QAudioDeviceInfo info(QAudioDeviceInfo::defaultInputDevice());
    if (!info.isFormatSupported(m_format)) {
        qWarning() << "Default format not supported - trying to use nearest";
        m_format = info.nearestFormat(m_format);
    }
 
    m_audioInfo  = new AudioInfo(m_format, this);
    connect(m_audioInfo, SIGNAL(update()), SLOT(refreshDisplay()));
 
    createAudioInput();
}
 
void InputTest::createAudioInput()
{
    m_audioInput = new QAudioInput(m_device, m_format, this);
    m_audioInput->start();
}

QT 예제 소스에서, 마이크입력을 읽어서 일정한 간격마다
qint64 AudioInfo::writeData(const char *data, qint64 len) 가 호출되고,
(data는 마이크입력 데이터인듯)
wirteData 작업이 끝나면 update() 시그널이 emit 되는거 같은데... (첨부파일 참고)

질문: 마이크입력 data를 rtpsend.c 소스에서처럼 전송하려면 어떻게해야하는건가요?
rtpsend.c 소스에서
while( ((i=fread(buffer,1,160,infile))>0) && (runcond) ) 라고 되어 있는 부분에 적용해야 할거 같은데..
어떤 식으로 해야 할지 잘 모르겠습니다.

감사합니다.

File attachments: 
첨부파일 크기
Package icon audioinput.zip7.51 KB
shint의 이미지

파일을 올리기 그러니. 내일 네이트온으로 연락주세요.
shintx@nate.com

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

pogusm의 이미지

혹시 아시는분 계시면 답변 부탁드립니다.

shint의 이미지

완벽하지는 않고. 그냥 컴파일 되서 실행만 되는 수준입니다.
혹시나 빌드에 대해. 어려움이 있으신분에게는 도움이 될겁니다.

static library는 GPL 라이센스가 걸리니까요.
static으로 해서 소스 공개해도. 별로 상관없을거 같던데요... 하튼...
상용 서비스를 위해. 억지로 DLL 컴파일 해봤습니다.

oRTP
qwave
libsamplerate

qwave는 빌드가 되긴 했는데. 제대로 되지 않아서. 다운 받은거로 사용 했습니다.

/GS 옵션 처리한게 마음에 걸리는데요.
strcpy_s 나 sprintf_s 등을 사용해도 에러가 나서. 그냥 /GS옵션으로 넘어갔습니다.

아시는 분이 계시면. 답변 달아주세요.

RTP로 전송하는 루틴도 약간 테스트해봤는데.
일단. 값 자체가 가는것 까지는 봤지만. 확실하지는 않습니다. 형식을 몰라서요.

필요하신분 사용하세요.

https://docs.google.com/folder/d/0B_788O9A9oekYkE0ZUJWdVliUTA/edit

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

pogusm의 이미지

답변 감사합니다

덧붙이자면,
보통의 경우 ortp-0.20.0 는 MSYS 에서 (윈도우7)
# ./configure
# make
만으로 문제없이 빌드가 됩니다.

그리고 질문은 ortp 빌드 문제가 아니니..
아직 본 질문은 미해결 중입니다..

여전히 고수분들의 조언을 기다립니다. ㅠㅠ

감사합니다.

shint의 이미지

가능하면 리눅스 빌드도 해볼 생각입니다.
관련 자료와 문서에 대해서 연구해보고 싶으신 분은 참고해보세요.

https://docs.google.com/presentation/pub?id=1d0edJ_lhW2akaDRAKvO0wCWINvLfDYktCjNe_jrjVUo&start=false&loop=false&delayms=3000

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

shint의 이미지

기본이 되는 소스를 만들어 봤습니다. 참고해 보세요.
http://www.devpia.com/Maeul/Contents/Detail.aspx?BoardID=278&MAEULNO=20&no=32157&page=1

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.