2010년 4월 16일 금요일

VLC UDP 스트리밍

UDP로 수신한 데이터를 VLC를 통해 Play되게 하기..

1. VLC 의 미디어->네트워크 스트림열기->UDP 선택
주소는 VLC 플레이어가 설치된 PC의 주소임(스트리밍 서버의 주소가 아님)
포트는 UDP 데이터를 수신하고자 하는 포트를 기재

시작~ 하고 기다림.


2. 스트리밍 서버가 될 녀석이 아래와 같은 코드로 전송토록 함.

#include
#include
#include

#include
#include
#include

main()
{
char ch[1025];
FILE *fp;
int len;
int sockfd;
int ret;

struct sockaddr_in servaddr;

fp=fopen("media.avi","r");
if(!fp) exit(0);

memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_port=htons(1234);
inet_pton(AF_INET, "아이피 ㅋㅋ", &servaddr.sin_addr);

sockfd=socket(AF_INET, SOCK_DGRAM, 0);

while(!feof(fp))
{
len=fread(ch, 1, 1024, fp);
ret=sendto(sockfd, ch, len, 0, &servaddr, sizeof(servaddr));
printf("%d:sending %d byte\n", ret, len);
usleep(1000*10);
}
fclose(fp);

}


3. 결과

- 화면에서 플레이가 이뤄지나, UDP 로 데이터가 전달되고 있는 동안은 말소리 엄청 빠름.
- 화면도 정지영상에 가까움.
- 로그를 띄워보니 'header damaged' 라고 나옴.
- 너무 빨라서 그러나 싶어 usleep값을 조절했으나 동일.

4. 그래서..

- MPEG 잘하는 후배녀석(서미)에게 급 도움 요청
- 일반 MPEG파일은 안되고 TS 포맷으로 변환해서 전달해 줘야 한다고 함.

5. 그래서리..

- 다음팟 플레이어로 스트리밍용으로 변환(WMV 변환이라고 해놓고 파일은 AVI로 나옴)
- 암튼, 변환해서리 재시도

6. 그랬더니..

- 안됨. 아예 화면 뜨지도 않음.
- 로그를 보니, "avi demux error: avi module discarded (invalied file)" 이라고 함.

7. 그래가지구서리..

- 파일 변환이 잘못된듯 싶어 파일 변환 다른 툴로 다시 시도..하려다가...
- 그냥 DVD의 VOB 파일을 냅다 열어서 시도..

8. 그랬더니..

- 플레이 되고 음성도 잘 나옴...
- 다만, 패킷을 받는 도중에는 화면 딕딕딕 멈추고 점프하고 음성이 쪼오끔 빨리 진행되는 경향이 아직 있음.
- 정리하면, 플레이는 가능하나 서비스했다간 욕얻어먹기 십상...

9. 결론

- 좀더 알아보자.

10. 그래도 한번더....

- 한번에 보내는 UDP의 크기를 10배(10240)로 올렸더니... 일단 패킷은 잘 간다...
- 근데, 화면이 훅 날라간다. 즉, 네트워크 전송속도에 맞춰 플레이된다는 말..
- 아마 VLC의 버퍼링(캐싱) 설정에 따라서 그런것인듯...

댓글 1개:

  1. packet 사이즈를 VLC가 좋아하는 1392바이트로 맞춰주고... 전송 간격 조절해주니까 깔끔하게 잘 나옴.

    자세한 방법 궁금하면 메일 투 미.

    답글삭제