사용자 도구

사이트 도구


project:personalstreaming

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

project:personalstreaming [2013/02/10 06:30] – [구현 방법] 127.0.0.1project:personalstreaming [2014/10/09 21:24] (현재) – 바깥 편집 127.0.0.1
줄 39: 줄 39:
     * 물론 요즘 디지털 카메라들은 어마어마한 화수 수를 자랑하지만, 어쨌든 연속된 신호 형태로 기록하는 건 아니니 띄엄띄엄입니다.     * 물론 요즘 디지털 카메라들은 어마어마한 화수 수를 자랑하지만, 어쨌든 연속된 신호 형태로 기록하는 건 아니니 띄엄띄엄입니다.
     * 아무리 좋은 디지털 카메라라도 촬영된 영상을 확대하고 확대하면 결국 우측 위 사진처럼 깍두기 현상 - 계단 현상이 일어나기 마련입니다.      * 아무리 좋은 디지털 카메라라도 촬영된 영상을 확대하고 확대하면 결국 우측 위 사진처럼 깍두기 현상 - 계단 현상이 일어나기 마련입니다. 
-    * 샘플링은 가역적인 작업입니다. 현실 세계를 샘플링해 사진으로 만들 수 있지만, 그 반대로 사진으로 현실 세계를 만들 수는 없습니다.+    * 샘플링은 가역적인 작업입니다. 현실 세계를 샘플링해 사진으로 만들 수 있지만, 그 반대로 사진으로 현실 세계를 만들 수는 없습니다.
     * 샘플링된 빛은 보통 사각 모눈과 같이 빛의 3원색인 적, 녹, 청 3색의 강도(intensity)로 표현됩니다. 즉 빛의 세기가 숫자로 표현되는 것입니다. \\ \\     * 샘플링된 빛은 보통 사각 모눈과 같이 빛의 3원색인 적, 녹, 청 3색의 강도(intensity)로 표현됩니다. 즉 빛의 세기가 숫자로 표현되는 것입니다. \\ \\
   - 보통 이렇게 샘플링된 데이터를 일컬어 '원본 데이터'라고 합니다. 보통 멀티미디어의 원본 데이터는 분량이 상당합니다.   - 보통 이렇게 샘플링된 데이터를 일컬어 '원본 데이터'라고 합니다. 보통 멀티미디어의 원본 데이터는 분량이 상당합니다.
줄 155: 줄 155:
  
 첫번째 예는 1 프레임만 추출. 두번째 예는 10프레임을 ''screenshot_01.png'', ''screenshot_02.png'', ... 로 추출한다. 첫번째 예는 1 프레임만 추출. 두번째 예는 10프레임을 ''screenshot_01.png'', ''screenshot_02.png'', ... 로 추출한다.
 +
 +== 영상 파일의 일부분만을 잘라냄 ==
 +  ffmpeg -ss <시작시간> -t <재생시간> -i <입력파일> -acodec copy -vcodec copy <출력파일>
 +
 +  * 시작시간: 00:00:00 과 같이 입력
 +  * 재생시간: 시작 시간부터 잘라낼 시간. 시작 시간과 마찬가지로 입력
 +
 +
  
 == 기타 == == 기타 ==
줄 458: 줄 466:
  
 === 트랜스코더의 출력 변경 === === 트랜스코더의 출력 변경 ===
-기본 방법으로는 하나의 비트레이트로 .ts 파일을 만들면 되지만 AHLS는 같은 내용의 다른 비트레이트를 가진 .ts를 여러 벌 준비해야 합니다. 실시간 트랜스코딩 및 스트리밍을 제공하려면 서버는 한 번에 다수의 출력을 만들 수 있는 인코더를 준비해야 합니다.+HLS는 단 하나의 비트레이트로 하나의 .ts 세그먼트 파일 세트를 만들면 되지만 AHLS는 같은 내용의 다른 비트레이트를 가진 .ts 세그먼트를 여러 세트로 준비해야 합니다. 그러므로 실시간 스트리밍을 제공하려면 서버는 한 번에 다수의 출력을 만들 수 있는 성능 좋은 인코더를 준비해야 합니다.
  
 HLS를 소개하며 사용한 VLC는 한 번에 다수의 인코딩 결과를 내놓을 수 있도록 잘 설계 되어 있지만, 2013년 2월 현재 AHSL는 지원하지 않는 듯합니다. 다만 비슷한 ABS 기술인 [[http://en.wikipedia.org/wiki/Dynamic_Adaptive_Streaming_over_HTTP|MPEG-DASH]]는 VLC [[http://www-itec.uni-klu.ac.at/dash/?page_id=10 |플러그-인]]이 나왔습니다. MPEG-DASH에 대해서는 따로 검색을 하시기 바랍니다. HLS를 소개하며 사용한 VLC는 한 번에 다수의 인코딩 결과를 내놓을 수 있도록 잘 설계 되어 있지만, 2013년 2월 현재 AHSL는 지원하지 않는 듯합니다. 다만 비슷한 ABS 기술인 [[http://en.wikipedia.org/wiki/Dynamic_Adaptive_Streaming_over_HTTP|MPEG-DASH]]는 VLC [[http://www-itec.uni-klu.ac.at/dash/?page_id=10 |플러그-인]]이 나왔습니다. MPEG-DASH에 대해서는 따로 검색을 하시기 바랍니다.
  
-모바일 장비들은 이미 클라이언트의 기능이 잘 구현되어 있으므로 넘어가고, 사용자가 만든 서버는 간단하게 실습해 볼까 합니다. 
-VLC에서 바로 AHLS를 지원하지 않으므로 조금 사전 작업이 많이 필요합니다. 그리고 개인 네트워크에서 인위적으로 대역폭의 변화를 시킬 수 있는지, 그리고 그것을 어떻게 기록할지는 좀 의문입니다. 
  
 === M3U8 파일의 태그 내용 추가 ==== === M3U8 파일의 태그 내용 추가 ====
 [[http://developer.apple.com/library/ios/#technotes/tn2288/_index.html#//apple_ref/doc/uid/DTS40012238 Example Playlist Files for use with HTTP Live Streaming [[http://developer.apple.com/library/ios/#technotes/tn2288/_index.html#//apple_ref/doc/uid/DTS40012238 Example Playlist Files for use with HTTP Live Streaming
- |애플의 기술 문서]]를 참고하면, M3U8에 AHSL을 가능하도록 한 것을 'variant playlist'라고 합니다. 다음은 variant playlist의 예제입니다. + |애플의 기술 문서]]에서는 AHSL에 필요한 M3U8 플레이 리스트 파일을 가리켜 'variant playlist'라고 합니다. 다음은 variant playlist의 예제입니다.
 <code> <code>
 #EXTM3U #EXTM3U
줄 488: 줄 493:
 </code> </code>
  
-''EXT-X-STREAM-INF'' 태그는 다른 플레이 리스트를 참조할 때 사용합니다. 예제와 같이 다음과 같은 속성들이 의도어 있습니다.+''EXT-X-STREAM-INF'' 태그는 다른 플레이 리스트를 참조할 때 사용합니다. 다음과 같은 속성들을 지해 줍니다. 
  
   * ''PROGRAM-ID'' \\ 정수로 표현하며 여러 다른 설정의 인코딩이 하나의 영상에서 나왔음을 표시하기 위해 사용합니다. 위 예제의 하위 플레이 리스트는 모두 5개이지만 5개 모두 같은 동영상을 인코딩한 것입니다. \\ \\   * ''PROGRAM-ID'' \\ 정수로 표현하며 여러 다른 설정의 인코딩이 하나의 영상에서 나왔음을 표시하기 위해 사용합니다. 위 예제의 하위 플레이 리스트는 모두 5개이지만 5개 모두 같은 동영상을 인코딩한 것입니다. \\ \\
줄 503: 줄 508:
     * ''avc1.66.30''과 ''avc1.77.30''은 iOS 버전 3.0부터 3.12와의 호환을 위해 사용합니다.     * ''avc1.66.30''과 ''avc1.77.30''은 iOS 버전 3.0부터 3.12와의 호환을 위해 사용합니다.
  
-=== 실습해보기 === +==== 실습해보기 ==== 
-VLC로 간편게 라이브 스트리밍을 할 수는 없만, 조금 불편해도 미리 .ts와 .m3u8을 직접 만들어 실험을 해 습니다.+VLC가 아직 AHLS를 지원하지 않아 조금 불편하긴 하지만 간단한 수준에서 실습을 해 보겠습니다.  간단한 수준이니 .ts와 .m3u8을 직접 손으로 만들어 보는 것도 그리 나쁘지 않은 것 같습니다.
  
 우선 석 장의 아주 간단한 그림 파일을 만들었습니다. 우선 석 장의 아주 간단한 그림 파일을 만들었습니다.
줄 512: 줄 517:
 {{:project:personalstreaming:lo.jpg?nolink&200}} {{:project:personalstreaming:lo.jpg?nolink&200}}
  
-'H'가 써진 그림 파일은 640x480, 'M'와 'L'이 그려진 그림 파일은 480x360으로 만들었습니다. 그리고 적당히 [[http://www.wavtones.com/functiongenerator.php | 일정한 톤의 소리]]를 만들었습니다. 각기 다른 3개의 10초의 WAV 파일을 생성했는데, H는 높은 주파수, M은 중간, L은 낮은 주파수에 사용할 것입니다. 그리고 WAV 파일을 [[http://lame.sourceforge.net/|lame]]을 이용해 mp3 파일로 변환시켰습니다. 기본이 128kbps 이므로 대략 1/10로 용량이 줄어듭니다.+'H'가 써진 그림 파일은 640x480, 'M'와 'L'이 그려진 그림 파일은 480x360으로 만들었습니다. 그리고 적당히 [[http://www.wavtones.com/functiongenerator.php | 일정한 톤의 소리]]를 만들었습니다. 각기 다른 3개의 10초의 WAV 파일을 생성했는데, 각각 높은 주파수, 중간 주파수, 낮은 주파수입니다. 'H'는 높은 주파수'M'은 중간 주파수와'L'은 낮은 주파수와 같이 사용할 것입니다. \\ 한편 WAV 파일을 [[http://lame.sourceforge.net/|lame]]을 이용해 mp3 파일로 변환시켰습니다. 기본이 128kbps 이므로 대략 1/10로 용량이 줄어듭니다.
 <code> <code>
 lame hi.wav hi.mp3 lame hi.wav hi.mp3
줄 518: 줄 523:
 lame lo.wav lo.mp3 lame lo.wav lo.mp3
 </code> </code>
-그다음 ffmpeg을 이용해 영상과 소리를 합쳐 각 10초의 재생 시간을 가진 동영상으로 만들어냅니다. 실제 서비스에 사용될 동영상은 비트레이트 등에 주의해서 인코딩 해야 하나, 여기서는 단순 실습용이기 때문에 그렇게 큰 신경을 쓰지 않아도 됩니다. 생성 후 모바일 장치에서 올바르게 재생되는지 확인하세요. +그다음 ffmpeg을 이용해 영상과 소리를 합쳐 각 10초의 재생 시간을 가진 동영상으로 만들어냅니다. 실제 서비스에 사용될 동영상은 비트레이트 및 여러 환경을 주의 깊게 고려해서 인코딩 해야 하나, 여기서는 단순 실습용이기 때문에 그렇게 큰 신경을 쓰지 않고 만들었습니다. 생성 후 모바일 장치에서 올바르게 재생됨을 확인하였습니다.
 <code> <code>
 ffmpeg -loop 1 -i hi.jpg -i hi.wav -acodec aac -ac 2 -strict experimental -ab 40k -vcodec libx264 -preset slow -profile:v baseline -level 31 -b:v 600k -f mpegts -threads 0 -y -t 10 hi.ts ffmpeg -loop 1 -i hi.jpg -i hi.wav -acodec aac -ac 2 -strict experimental -ab 40k -vcodec libx264 -preset slow -profile:v baseline -level 31 -b:v 600k -f mpegts -threads 0 -y -t 10 hi.ts
줄 527: 줄 531:
 ffmpeg -loop 1 -i lo.jpg -i lo.wav -acodec aac -ac 2 -strict experimental -ab 40k -vcodec libx264 -preset slow -profile:v baseline -level 31 -b:v 110k -f mpegts -threads 0 -y -t 10 lo.ts ffmpeg -loop 1 -i lo.jpg -i lo.wav -acodec aac -ac 2 -strict experimental -ab 40k -vcodec libx264 -preset slow -profile:v baseline -level 31 -b:v 110k -f mpegts -threads 0 -y -t 10 lo.ts
 </code> </code>
-각 파일을 모두 5개씩 사본을 만들어 H, M, L이 각각 1분간 재생되도록 만들었습니다. 그리고 파일의 이름은 알맞게 {hi, mi, lo}_{0-5}.ts로 변경했습니다. +각 파일을 모두 5개씩 사본을 만들어 H, M, L이 각각 1분간 재생되도록 만들었습니다. 그리고 파일의 이름은 알맞게 {hi, mi, lo}_{0-5}.ts로 변경했습니다. 원래는 긴 파일을 잘게 쪼개 세그먼트를 만들어야 하지만, 이렇게 반대로 해도 큰 문제는 없습니다. \\ 
- +이제 플레이 리스트를 만들어야 합니다. hi, mi, lo 각 대역폭에 대한 플레이 리스트는 다음과 같이 생성했습니다.
-이제 플레이 리스트를 만들어야 합니다. 각 lo, mi, hi에 대한 플레이 리스트는 다음과 같이 생성했습니다.+
 <code> <code>
 #EXTM3U #EXTM3U
줄 556: 줄 559:
 </code> </code>
  
-'lo' 부분은 적절히 mi, hi로 변경하여 lo.m3u8, mi.m3u8, hi.m3u8로 각각 저장합니다. 그러면 가장 마지막으로 이 되는 ahls.m3u8 파일을 작성해 보겠습니다.+'hi' 부분은 적절히 mi, lo로 변경하여 hi.m3u8, mi.m3u8, lo.m3u8로 각각 저장합니다. \\ 이제 마지막으로 variable playlist인 ahls.m3u8 파일을 작성해 보겠습니다. 앞서 제시한 예제 파일과 크게 달라지는 것은 없습니다.
 <code> <code>
 #EXTM3U #EXTM3U
줄 570: 줄 573:
 </code> </code>
  
-파일들을 서버에 위치시키고, 테스트해 보았습니다. 처음에는 'L'로 나오다가 10초 후에는 'H'로 변경될 것입니다. 그리고 대역폭에 따라 'M'이 나올 것입니다. 그러나 요즘 워낙 인터넷 속도가 빠니다. 원래 빠른 걸 억지로 게 만들기 쉽지 않습니다. 이럴 때는 ahls.m3u8의 BANDWIDTH 값을 조정하면 됩니다. 사용 중인 인터넷 회선 속도에 맞춰 이 값을 잘 조정하면, 10초 이후 영상에서 'M'이 나오는 것을 확인할 수 있습니다. 아예 mi와 hi의 BANDWIDTH를 회선 속도가 미칠 수 없는 수치까지 올려버리면 영상은 계속 'L'만을 출력할 것입니다. 또한 10초 이후 'M'이나 'H'가 출력될 때, 영상의 슬라이더 바를 옮겨 0초부터 다시 재생을 해 보세요. 0초부터에서도 'M'이나 'H'가 나오는 것을 확인할 수 있습니다.+파일들을 서버에 위치시키고, 테스트해 보았습니다. 처음에는 'L' 글씨가 나오다가 10초 후에 'H'로 변경되었습니다. 그리고 동영상이 끝날 때까지 'H글자가 변하지 않습니다. 살짝 문제가 있습니다. 요즘 워낙 인터넷 속도가 빠른 게 문제입니다. 모바일 장치의 대역폭을 임의로 조절해야 하는데, 장치의 대역폭을 물적으로 변경하는 조절하기는 쉽지 않습니다. \\ 이럴 때는 ahls.m3u8의 BANDWIDTH 값을 장치의 대역폭에 맞추여 상대적으로 조정하면 됩니다. 값을 적절히 조정하면, 10초 이후 영상에서 'M' 글자가 나오는 것을 확인할 수 있습니다. 아예 mi와 hi의 BANDWIDTH를 회선 속도가 미칠 수 없는 수치까지 올려버리면 영상은 계속 'L'만을 출력할 것입니다. 또한 10초 이후 'M'이나 'H'가 출력될 때, 영상의 슬라이더 바를 옮겨 0초부터 다시 재생을 해 보세요. 0초부터에서도 'M'이나 'H'가 나오는 것을 확인할 수 있습니다.
  
-제가 직접 아이패드로 테스트한 결과를 비디오로 촬영하여 YouTube에 업로드 하였습니다. [[http://youtu.be/O5vMvbYCENI|여기]]와 [[http://youtu.be/CsYWjCKwpIc|여기]]서 확인하실 수 있습니다. +제가 직접 아이패드로 테스트한 결과를 비디오로 촬영하여 YouTube에 업로드 하였습니다. [[http://youtu.be/nICjZ-BWEC4|여기]]와 [[http://youtu.be/pYQWaSyzOvA|여기]]서 확인하실 수 있습니다.
- +
-아래는 작업한 파일들을 zip 파일로 압축한 것입니다.+
  
 +아래는 작업한 파일들을 zip 파일로 압축한 것입니다. \\
 {{:project:personalstreaming:ahls_src.zip|}} {{:project:personalstreaming:ahls_src.zip|}}
  
줄 583: 줄 585:
 지금까지 HTTP Live Streaming에 대해 소개하고 VLC media player를 이용해 동영상 파일을 트랜스코딩하여 네트워크를 통해 전송하는 예를 들어 보았습니다. 이 기술은 사실 웹과 음성, 그리고 영상 데이터까지 처리해야 하므로 그 기반은 매우 다채롭고 복잡합니다. 문서는 개론적인 사항들에 대해서만 간결히 소개하는 정도로 그칩니다. 이 이후의 더욱 자세한 사항은 영상 처리 및 압축 기술에 대한 이해를 필요로 할 것입니다. 서버 운영에 대한 지식도 필요하겠죠. 쉽지 않습니다. ;-) 지금까지 HTTP Live Streaming에 대해 소개하고 VLC media player를 이용해 동영상 파일을 트랜스코딩하여 네트워크를 통해 전송하는 예를 들어 보았습니다. 이 기술은 사실 웹과 음성, 그리고 영상 데이터까지 처리해야 하므로 그 기반은 매우 다채롭고 복잡합니다. 문서는 개론적인 사항들에 대해서만 간결히 소개하는 정도로 그칩니다. 이 이후의 더욱 자세한 사항은 영상 처리 및 압축 기술에 대한 이해를 필요로 할 것입니다. 서버 운영에 대한 지식도 필요하겠죠. 쉽지 않습니다. ;-)
  
-한편 예제를 통해 스트리밍이 올바로 되는 것은 확인하였지만, 쓰기 편하고 예쁘게 다듬는 일은 별의 힘들고 고된 작업입니다. 혼자만으로는 거의 불가능하며, 더더욱 많은 시간과 노력을 필요로 합니다. 예를 들어 파이썬 기반으로 웹 앱을 만들 거라면 '[[https://www.djangoproject.com/|장고(Djago)]]'와 같은 프레임워크가 붙여야 할 겁니다. 차후 장고에 대한 튜토리얼 형식으로 문서의 내용을 심화시켜볼 생각은 갖고 있습니다. 그러나 완성도 높은 여타 프로젝트가 있으니 확실한 목표 없이 '바퀴를 다시 만들' 필요는 없지 않을까 생각합니다.+한편 예제를 통해 HLS를 직접 실험해 보았습니다. 기본적인 HLS는 VLC의 기반으로 간편하게 구현할 수 있었습니다. 이를 통해 HLS는 기존의 웹서버를 크게 변경시키지 않고도 멀티미디어의 스트리밍이 가능함을 확인했습니다. 한편 AHLS에서는 사용자의 네트워크 환경에 맞추어 스트리밍되는 파일의 품질이 동적으로 변경되는 것을 확인하였습니다. 
 + 
 +문서를 통해 스트리밍의 개념과 단순한 동작은 확인하였지만, 사용자가 보다 쓰기 좋도록 다듬는 일은 전혀 의 작업이며, 매우 힘들고 고된 작업입니다. 혼자만으로는 거의 불가능하며, 매우 많은 시간과 노력을 투자해야 합니다. 만약 파이썬 기반으로 웹 앱을 만들 거라면 '[[https://www.djangoproject.com/|장고(Djago)]]'와 같은 프레임워크가 붙여야 할 것이고, 원활한 스트리밍을 위해서라면 튼튼하고 성능이 뛰어난 인코더 장비가 따로 있어야 할 겁니다. 차후 장고에 대한 튜토리얼 형식으로 문서의 내용을 심화시켜볼 생각은 갖고 있습니다. 그러나 완성도 높은 여타 프로젝트가 있으니 확실한 목표 없이 '바퀴를 다시 만들' 필요는 없지 않을까 생각합니다.
  
 ===== 부록: 참조 링크 ===== ===== 부록: 참조 링크 =====
project/personalstreaming.1360477839.txt.gz · 마지막으로 수정됨: 2014/10/09 21:23 (바깥 편집)

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki