apache2 아이폰 mp4 스트리밍

poss의 이미지

테스트서버(ubuntu 10.04, apache2)에 mp4 화일을 올려놓고,
아이폰으로 http://xxx.xxx.xxx.xxx/test.mp4
하면 잘 플레이 됩니다.

하지만 실제 사용할 서버(CentOS5.4, httpd2.2)에서는
플레이가 전혀 되지 않네요.

Ubuntu쪽 아파치 설정과 CentOS쪽 아파치 설정이 달라서 그런것 같긴 한데, 뭐가 다른지 모르겠습니다.
두 서버 다 설정은 기본 설정입니다.

혹시 비슷한 경험 있으신 분들 조언 부탁드려요.

참고로 스티리밍서버는 따로 구성하지 않았습니다.

luciell의 이미지

웹서버와 아이폰이 자체적으로 디코딩 가능한 동영상을 인터넷을 통해 불러올경우 자체적으로 디코디하여 잘 플레이 되는데
기타 지원하는 않는 포멧이라면 안되더군요..

저도 비슷한 경우로 우분투와 맥osx 아파치에서 테스트 해본 경험이 있네요(별도의 스트리밍 방식을 사용하지 않고 사파리로 url 동영상(mp4) url 접속)

동영상 포멧을 확인한번 해보시는건 어떨까요?

네가 꿈을 꾸지 않는 한, 꿈은 절대 시작되지 않는단다.
언제나 출발은 바로 '여기'야 떄가 무르익으면, 그럴수 있는 조건이 갖춰지면,
하고 미루다 보면, 오느새 현실에 파묻혀 소망을 잃어버리지.
그러므로 무언가 '되기(be)' 위해서는 반드시 지금 이 순간 무언가를 '해야(do)'만 해
- Stuart Avery Gold 의 우화소설 Ping 중에서..

poss의 이미지

화일 포맷 문제는 아닌듯 합니다.

Prentice의 이미지

PC에서

wget -S http://ubuntu.example.com/test.mp4
wget -S http://centos.example.com/test.mp4

했을 때 MIME type / Content-Type 내용이 서로 다른가요?

poss의 이미지

잘 되는 서버.
#wget -S --spider http://gaegle.co.kr/a.mp4
Spider mode enabled. Check if remote file exists.
--2012-06-14 09:33:32-- http://gaegle.co.kr/a.mp4
Resolving gaegle.co.kr... 115.86.218.39
Connecting to gaegle.co.kr|115.86.218.39|:80... connected.
HTTP request sent, awaiting response...
HTTP/1.1 200 OK
Date: Thu, 14 Jun 2012 00:33:32 GMT
Server: Apache/2.2.14 (Ubuntu)
Last-Modified: Thu, 07 Jun 2012 14:23:39 GMT
ETag: "1a004f-88311a-4c1e2a1499529"
Accept-Ranges: bytes
Content-Length: 8925466
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: video/mp4
Length: 8925466 (8.5M) [video/mp4]
Remote file exists.

안되는 서버

# wget -S --spider http://xxx.xxx.xxx.xxx/test/a.mp4
Spider mode enabled. Check if remote file exists.
--2012-06-14 09:45:26-- http://xxx.xxx.xxx.xxx/test/a.mp4
Resolving xxx.xxx.xxx.xxx... 0.0.0.0
Connecting to xxx.xxx.xxx.xxx|0.0.0.0|:80... connected.
HTTP request sent, awaiting response...
HTTP/1.1 200 OK
Date: Thu, 14 Jun 2012 00:44:19 GMT
Server: Apache/2.2.3 (CentOS)
Last-Modified: Thu, 07 Jun 2012 14:23:39 GMT
ETag: "28005b2-88311a-a140f0c0"
Accept-Ranges: bytes
Content-Length: 8925466
Keep-Alive: timeout=1, max=100
Connection: Keep-Alive
Content-Type: video/mp4
Length: 8925466 (8.5M) [video/mp4]
Remote file exists.

아, 플레이가 안되는 서버와 잘 되는 서버의차이는,
안되는 서버의 상단에 각종 보안장비들(방화벽, IPS, 웹방화벽)이 있다는겁니다.
물론 80포트는 열려 있고요. 웹브라우져에서는 quicktime 플러그인설치되어 있으면
픞레이가 둘 다 잘 됩니다.... ;ㅡㅡ

poss의 이미지

아, 확인해 보니 플레이가 안되는 서버는. text/plane으로
잘 되는 서버는 video/mp4 로 나옵니다...

poss의 이미지

어. 착각 했어요. 두 서버 다
video/mp4 로 나옵니다...

혹시 몰라 안드로이드에서 확인 해 봤는데, 안드로이드는 두 서버 모두 잘 플레이 됩니다

아이폰에서는 왜 안될까요?

robelias@naver.com의 이미지

비슷한 문제로 고민 중입니다.

우분투 10.04, 페도라6, 윈도우xp, 임베디드 리눅스에 웹서버를 열어놓은 상태입니다.

리눅스 계열 OS에는 모두 아파치 2.2.8 버전을 사용 중이며,

윈도우xp에는 아파치 2.2.4버전을 사용중입니다.

우분투 10.04, 페도라6, 윈도우7, 갤럭시s2, 아이폰, 아이패드 등에서 테스트 했습니다.

문제는 아이폰과 아이패드입니다.

여타 우분투, 페도라6, 윈도우xp 의 웹서버에서는 모두 정상적으로 영상이 보입니다.

임베디디 리눅스의 웹서버에서와 iOS계열이 문제네요.

http://192.168.0.100/video/sample.mp4

파일이 열리지가 않습니다.

poss님과 비슷한 상황인지라 이렇게 글 남깁니다.

혹시 해결하셨거나 참고할 내용 있으면 좀 부탁드릴께요.

robelias@naver.com으로 메일 부탁드리겠습니다.

p.s : 애플 테러하러 가실 분 모집합니다.

익명 사용자의 이미지

http://mobiforge.com/developing/story/content-delivery-mobile-devices

Quote:
Appendix A: Streaming for Apple iPhone

Apple iPhone uses HTTP byte-ranges for requesting audio and video files. First, the Safari Web Browser requests the content, and if it's an audio or video file it opens it's media player. The media player then requests the first 2 bytes of the content, to ensure that the Webserver supports byte-range requests. Then, if it supports them, the iPhone's media player requests the rest of the content by byte-ranges and plays it.

http://hckim.tistory.com/389

Quote:
Range 요청 취약점?

http는 헤더정보에 Range를 사용해서 콘텐츠의 일부만 요청할 수 있습니다 . 파일 이어받기 또는 p2p 등에서 파일의 일부만을 특정 서버에서 받고자 할 때, video 스트리밍, pdf 등의 다운로드가 사용합니다. 이번의 이슈는 이 http header 에 Range를 요청하는 취약점을 이용해서 아파치 웹서버에 DoS 공격이 가능하다는 것이죠

이 둘이 어떤식으로든 상호작용하고 있을 가능성이 있습니다. 아파치 단에서 Range 요청에 대한 어떤 패치가 되어 있다던지, 중간 네트워크 경로 어디선가 Range 요청을 차단하고 있다던지 하는 등의 시나리오를 생각할 수 있겠습니다.

꼭 이게 원인이 아니더라도 동작하는 상황과 동작하지 않는 상황 모두 시뮬레이션할 수 있으므로 wireshark 등으로 패킷을 분석해 보는 것을 추천드립니다.

김정균의 이미지

보통 player들이 http protocol을 통해 처리를 할때, 처음 시작할 경우에는 200으로 처리를 할 텐데요. 동영상 넘기기 같은 것을 할 때나 206으로 재 요청을 하는 것으로 알고 있습니다. 그러므로 이 문제는 아닐 듯 싶습니다.

익명 사용자의 이미지

기존 구현이 어떠한지는 모르겠습니다만, 제 생각에는 200으로 수동적으로 처리하는 것보다는 206을 적절히 사용하는 것이 나은 방식이라고 생각합니다. 예를 들어 대용량 비디오 파일을 재생각은 경우도 대비해서...

제가 아는 선에서 player가 서버에서 byte-range header를 통해 컨텐츠를 받는 방식은 대충 아래와 같은 시나리오로 진행합니다.

HEAD /video/sample.mp4 HTTP/1.1
Host: 192.168.0.100
 
HTTP/1.0 200 OK
Accept-Ranges: bytes
Content-Length: 2000
Content-Type: video/mp4
 
==================================================
GET /video/sample.mp4 HTTP/1.1
Host: 192.168.0.100
Range: bytes=0-999
 
HTTP/1.0 206 Partial Content
Accept-Ranges: bytes
Content-Length: 1000
Content-Range: bytes 0-999/200
Content-Type: video.mp4
 
DATA1
==================================================
 
GET /video/sample.mp4 HTTP/1.1
Host: 192.168.0.100
Range: bytes=1000-
 
HTTP/1.0 206 Partial Content
Accept-Ranges: bytes
Content-Length: 1000
Content-Range: bytes 1000-1999/2000
Content-Type: video/mp4
 
DATA2

여기서 처음 HEAD method를 통해서 컨텐츠의 크기를 알아내고, 또 Accept-Ranges: bytes를 보고 서버가 byte-range request에 응답할 수 있음을 알 수 있습니다.

그런데 위 댓글에서도 적었다시피 iphone의 경우에는 HEAD method를 쓰지 않고, 처음부터 GET method에서 "Range: bytes=0-1" 헤더를 포함해서 보내고, 응답이 적절할 경우 이후 순서를 진행하는 듯 보입니다.

robelias@naver.com의 이미지

206 패킷을 보낼 시 한가지 이상한 문제가 있었습니다.

"Response Header"의 "Content Range"가 "4294967296-2241967/5578101213906606520"이렇게 나옵니다.

정상적인 우분투의 "Response Header"의 "Content Range"는 "0-1/5183534"입니다.

혹시 엔디안 문제일까요?

우분투의 경우 big를 사용하고, 저희 임베디드 리눅스는 리틀을 사용합니다.

빅을 사용하는 임베디드 리눅스에 테스트해보아야겠습니다. ㅠㅠ

다른 의견 있으신 분 어떤의견이라도 감사히 듣겠습니다.

익명 사용자의 이미지

일단 iphone에 video streaming의 원인이 이것이 아니더라도, 현재 포팅하고 계신 apache가 명백히 잘못된 응답을 하고 있기 때문에, 이 부분을 찾아서 수정하시는 것이 먼저라고 생각합니다.

robelias@naver.com의 이미지

답변 감사합니다.

아파치 서버랑 웹쪽은 해본적이 없는지라.

"Response"에 대해 자세히 정의해주셔서 감사합니다.

p.s 서버 문제인거 같지만...
애플에는 테러하러 가야겠습니다.
가실분 모집합니다.

robelias@naver.com의 이미지

srclib/apr/include/apr.h 파일을 수정 후 잘됩니다.

//sukyung's change
//typedef off_t apr_off_t;
typedef long long apr_off_t;

위와 같이 off_t 자료형을 8Byte "long long"로 수정후 동영상이 나오기 시작했습니다.

But iOS6 패치 후 다른 문제가 발생하였습니다.

이넘의 애플은 정말..~~싫습니다.

P.S 테러하러가실분 여전히 모집합니다.
아직 한분도 지원하지 않았습니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.