2012년 9월 17일 월요일

FluorineFX가 정상적으로 구동되지 않는 경우 참고...

  • 환경 : FluorineFX, Flash Builder 4.5, IIS 7.5
  • 개요 : FluorineFX를 통해서 Server Module을 구성하고 Flash Builder를 통해서 Client Module을 구성하여 IIS 7.5에 Porting을 하면 "NetConnection.Connect.Failed" 오류가 발생하고 Fluorine FX의 로그에서는 "Failed to locate the requested Type" 오류 로그가 발생하였다.
  • 증상
    1. Video Recording 어플에서 정상적으로 FluorineFX가 기동되지 않았다.
    2. Flex의 디버그 상에서는 NetConnection.Connect.Failed 오류가 발생함.
    3. FluorineFX 로그 상에서는 Failed to locate the requested Type 로그가 표시됨.
  • 원인 분석
    1. IIS에 포팅된 웹어플리케이션에서 WEB-INF/flex/services-config.xml 파일을 삭제한 것이 원인이었다. 해당 파일은 Flex에서 어플을 만들 때,  Channel의 정보를 알려주기 위한 목적만 있는 것으로 이해를 했다. Flex 어플은 당연히 RTMP로 통신을 하기 때문에 Channel 정보가 불필요할 것으로 판단을 하고 삭제를 했던 것인데, FluorineFX 모듈에서도 해당 Channel 정보를 이용해서 기동하는  것 같다. 따라서 해당 파일을 삭제하니 FluorineFX가 정상적으로 기동되지 않았던 것이다.


참고로 Services-config.xml 파일의 내용은 다음과 같다.

<?xml version="1.0" encoding="utf-8" ?>
<services-config>
  <channels>
    <channel-definition id="my-rtmp" class="mx.messaging.channels.RTMPChannel">
      <endpoint uri="rtmp://{server.name}:1935" class="flex.messaging.endpoints.RTMPEndpoint"/>
    </channel-definition>
  </channels>
</services-config>

2012년 9월 12일 수요일

Error 1001. 설치를 초기화하는 동안 예외가 발생했습니다. System.BadImageFormatException

증상 :
Install Program에서 아래의 오류가 발생하고 설치가 실패


오류 내용 : 
Error 1001. 설치를 초기화하는 동안 예외가 발생했습니다.
System.BadImageFormatException : 파일이나 어셈블리 file:///C:\...\RIALab.Streaming.EncodingService.exe 또는 여기에 종속되어 있는 파일이나 어셈블리 중 하나를 로드할 수 없습니다. 현재 로드된 런타임보다 최신 런타임으로 어셈블리를 빌드했으므로 어셈블리를 로드할 수 없습니다.


원인 :
원래 설치하고자 하는 시스템은 .Net Framework 3.5를 기준으로 만들어졌고 Setup Project 또한 .Net Framework 3.5로 만들어졌었다.
이 프로젝트를 .Net Framework 4.0으로 Migration을 하고 설치 파일을 만들었으나 위의 오류가 발생하였다.

오류가 발생했던 원인은 단순했다.

Setup Project를 마우스 우클릭하여 View > Launch Conditions을 클릭하면 해당 화면이 표시되는데 "Launch conditions"라는 폴더 하부에 ".Net Framework"라는 항목이 있는 것을 볼 수 있다.
해당 항목을 클릭해서 속성을 보면 "Version" 값이 "3.5.30729"로 잡혀 있는 것을 확인할 수 있다.

즉, .Net 4.0으로 Migration을 하더라도 기존의 .Net 3.5 버젼 값은 변경되지 않아서 발생했던 문제다.


처리 방법 :
Version 값을 ".Net Framework 4.0"으로 변경/선택한다.

2012년 9월 11일 화요일

ffmpeg option에 대한 예제 및 설명

출처 : 아싸 좋구나 님의 블로그 (http://dicer.tistory.com/179)

아래의 내용은 계속해서 보강/수정할 예정임.

[내용]

제가 예전에 올려드린 배치파일 내에서 ffmpeg.exe 옵션에 대한 도움말입니다

길이 길어지는걸 방지하기 위해 따로 옮겼습니다

구형 배치파일을 기준으로 작성되었습니다만 신형배치파일과 대동소이합니다

배치파일
@echo off

for %%i in (%1, %2, %3, %4, %5, %6, %7, %8, %9) do
(
 ffmpeg.exe
 -y -i "%%~i" -threads 0 -vcodec libx264 -preset slow -crf 26 -sws_flags lanczos
 -vf "yadif=1:-1, crop=in_w-2*16:in_h-2*16, scale=1280:720, setsar=1:1"
 -r 60000/1001 -acodec aac -strict experimental -ab 192k -ac 2 -ar 44100
 "%%~ni.720p_60fps.x264_crf26.aac_192k.HQ.mp4"
)

//-----------------
// -threads 0
//-----------------
몇 스레드로 인코딩할지 결정
0으로 설정하면 자동선택
자신의 코어수로 설정
하이퍼스레딩을 쓴다면 코어수*2

그냥 0으로 쓰는게 최고
아니면 그냥 이옵션을 생략해두됨 그러면 기본값으로 0이 적용됨

//----------------------------------
// -vcodec libx264 -preset medium
//----------------------------------
x264를 이용해서 medium 프리셋 옵션으로 인코딩을 한다는 뜻
작년부터 x264에서 자체적으로 프리셋(일반적인 용도로 최적화된 옵션세팅)을 넣어서 배포하기 시작했는데
x264를 사용하는 많은 국산외산 인코더들은 이기능을 잘 활용하지않고
인코딩 속도를 위해 엉망인 옵션(me랑 subme를 대폭 낮추면 속도업 화질다운)을 기본설정으로 사용하고있습니다

medium 전단계인 fast만해도 충분히 좋은 화질을 얻을수 있구요
컴터 cpu가 빠방하다면 medium대신 slow나 veryslow를 넣어주시면됩니다

//----------------------------------------------------------------------
// 만약 baseline profile만 재생가능한 휴대기기용으로 인코딩을 하시려면
//----------------------------------------------------------------------
-x264opts cabac=0:bframes=0:ref=1:8x8dct=0:weightp=0
이걸 추가해주시면 baseline profile로 인코딩을 해줍니다
소형기기에서 재생하실테니 해상도도 줄여주시고
60프레임 bob디인터레이싱도 필요없으니 중간에 yadif=1,-1도 yadif=0,-1로 바꿔주시고
60000/1001 이것도 30000/1001로 수정해주시면 됩니다
-crf 26도 abr모드로 바꿔주세요 -b 1000k 이런식으로 

//---------------------------------------------------------
// 아이패드나 휴대기기용으로 main profile로 인코딩하시려면
//---------------------------------------------------------
-x264opts 8x8dct=0:weightp=0:level=31
이걸 넣어주세요
main은 baseline보다 cpu에 많이 부담이 가는데 high보다는 좀 적게 갑니다

//----------
// -crf 26
//----------
crf모드라고 화질기준 인코딩입니다 2pass보다 낫습니다
2pass는 주어진 비트레이트 내에서 최대효율을 추구한다면
crf는 비트레이트 제한이 없습니다
그래서 이미 손실이 일어난 hdtv영상이 원본인경우 오버슈팅이 발생하기도하는데
다른옵션을 통해 비트레이트 낭비를 막아줄수 있습니다
자세한거는 따로 물어보시고 일반인들은 요부분 패스하셔두됩니다
 
더 좋은 화질을 추구하신다면 -crf 25로 숫자를 줄여주시면 됩니다
근데 26만해도 충분하실겁니다 27 28정도로 높여도 hdtv소스가 구린경우는 별로 화질저하가 잘 느껴지지 않습니다 대신 용량은 팍팍 줄어들죠
abr모드로 인코딩을 하고싶으시면 -crf 26을 지우시고 -b 3000k 와같이 용량을 직접 적어주시면됩니다

//-----------------------
// -sws_flags lanczos
//-----------------------
lanczos 알고리즘으로 리사이즈를 합니다 근데 libavfilter로 리사이즈를 처리하는거라서 적용되는건지 확실치 않네요

//-------------------------------------------------------------------------
// -vf "yadif=1:-1, crop=in_w-2*16:in_h-2*16, scale=1280:720, setsar=1:1"
//-------------------------------------------------------------------------
큰따옴표 전체가 ffmpeg에 인코딩들어가기 전에 libavfilter로 처리해주는 부분입니다

//--------------
// yadif=1:-1,
//--------------
60프레임 bob 디인터레이싱 옵션입니다 움직임이 많은 영상에서는 필수죠
예능같은거 인코딩하실때는 굳이 60프레임으로 하실 필요없습니다
=1:-1 부분을 =0-:1 로 바꿔주시면
30프레임으로 디인터레이싱되서 인코딩 됩니다
더불어 뒤에 나오는 60000/1001 부분도 30000/1001로 수정해주셔야겠죠
그리고 일부 드라마나 hd로 방영되는 영화들은 이방법을 쓰면 안됩니다
그넘들은 원본이 24프레임이라서 텔레시네를 통해 60i로 변환되서 방송되는데
이들을 원래대로 돌리기위해서는 디인터레이싱이 아니라 역텔레시네(ivtc)를 해줘야해요
mplayer필터기능을 통해 ivtc를 해주는 필터(명령어 mp=ivtc)를 사용할수 있는데 현재는 제대로 작동이 안됩니다
아 그리고 소스자체가 프로그레시브인 블루레이나 캠코더영상은 이부분을 완전 빼주세요

//----------------------------
// crop=in_w-2*16:in_h-2*16
//----------------------------
이건 좌우 위아래서 16픽셀씩 잘라낸다는 뜻입니다
hdtv는 모서리에 블랙바나 잡신호가 끼고 방송국mpeg2인코더 특성상 1088로 출력되기때문에 크롭이 필수입니다
기호에 따라 바꿔주시면 됩니다

//-----------------------------
// scale=1280:720, setsar=1:1
//-----------------------------
scale은 화면크기구요 setsar은 그냥 냅두세요
setsar부분을 건드려주시면 아나몰픽 인코딩이 가능합니다

//------------------
// -r 60000/1001
//------------------
libavfilter에서 60프레임으로 넘겨주기 때문에 60프레임이라고 따로 지정해줘야합니다
30프레임이면 30000/1001 이라고
60대신 60000/1001을 쓰는 이유는 방송규격이 그래서

//------------------------------
// -acodec libmp3lame -ab 160k
//------------------------------
오디오코덱을 mp3로 오디오 비트레이트를 160k로 지정해주는 구문입니다
hdtv방송 출력(보통 192k ac3 일본방송은 aac)을 그대로 넣고 싶다면
이부분 전체를 -acodec copy로 바꿔주시면됩니다
그러면 인코딩없이 원본이 그대로 들어갑니다
aac로 인코딩 하겠다는 분들은
-acodec libmp3lame대신에 -acodec aac -strict experimental 을 넣어주시면됩니다
원래는 외부소스인 faac를 썼었는데 최근에 ffmpeg이랑 결별을 했구요
이제 ffmpeg은 자체적인 aac인코더를 씁니다
근데 faac나 ffmpeg aac나 성능이 nero에서 배포하는 aac인코더보다 못해요 그래서 experimental 옵션을 넣어줘야합니다
예전에는 둘다 완전 쓰레기였는데 요즘에는 그래도 인코더 구실을 합니다
아 그리고 기존 메구이를 이용한 방법에서는 일본방송 ts를 인코딩할때 일본방송은 aac를 써서 에러가 났었는데
ffmpeg을 이용한 방법에서는 에러없이 잘됩니다

//-------------------------------------------------
// "%%~ni.720p_60fps.x264_crf26.aac_192k.HQ.mp4"
//-------------------------------------------------
컨테이너를 mp4로 지정합니다 mkv를 쓰셔두되구요
근데 왠만하면 avi를 쓰지맙시다 h264코덱이랑 궁합이 안좋아요
특정폴더에 인코딩한걸 출력하길 원하시면
"c:\원하는폴더\%%~ni.720p_60fps.x264_crf26.aac_192k.HQ.mp4"
이런식으로 바꿔주면 됩니다
.720p_60fps.x264_crf26.aac_192k.HQ
요부분도 원하시는대로 바꾸셔두됨


=================================================================================
 내용추가

start /high /b /wait ffmpeg.exe -y -i "%~1" -threads 0 -vcodec libx264 -preset slow -crf 26 -sws_flags lanczos -vf "yadif=1:-1, crop=in_w-2*16:in_h-2*16, scale=1280:720, setsar=1:1" -r 60000/1001 -acodec libmp3lame -ab 192k -ac 2 -ar 44100 "%~d1%~p1%~n1.720p_60fps.x264_crf26.mp3_192k.HQ.mp4"

신형배치파일 구문에서

start /high /b /wait
 시피유 활용 우선순위를 높음으로 ffmpeg.exe를 작동시킵니다

다른작업시 약간 버벅거릴수 있습니다 원치 않으시면 이부분을 빼주세요


"%~d1%~p1%~n1.720p_60fps.x264_crf26.mp3_192k.HQ.mp4"
 폴더경로를 다 지정해주게 바꿨습니다

특정폴더에 저장하고 싶으시면 %~d1%~p1 요부분을 바꿔주세요 c:/동영상/ 이렇게 말이죠

2012년 9월 3일 월요일

"WebServiceHandlerFactory-Integrated 처리기의 모듈 목록에 잘못된 모듈 ManagedPipelineHandler가 있습니다."오류 발생시 처리 방법

증상 : IIS 7.x에서  아래와 같은 HTTP 오류가 발생한다.
오류 내용 : 
HTTP 오류 500.21 - Internal Server Error
WebServiceHandlerFactory-Integrated 처리기의 모듈 목록에 잘못된 모듈 ManagedPipelineHandler가 있습니다.

원인 : .Net Framework 4.0이 제대로 설정이 설치(설정)가 되지 않아서 발생된 문제임.

처리 방법 :  %windir%\Microsoft.NET\Framework\v4.0.21006\aspnet_regiis.exe -i
(64bit machie : C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis.exe -i)
Framework 버젼에 따라 경로명이 틀려질 수 있으므로 유의할 것.