2013년 12월 14일 토요일

[ios] AVAudioSessions이 active상태인지 확인..


아래처럼 썻었으나.. ios7.0부터 deprecated되버렸다..
7.x버전 이상에서 값이 넘어오지 않음.

UInt32 otherAudioIsPlaying = 0;
UInt32 propertySize = sizeof (otherAudioIsPlaying);
OSStatus status = AudioSessionGetProperty(kAudioSessionProperty_OtherAudioIsPlaying, &propertySize, &otherAudioIsPlaying);

if(kAudioSessionNoError == status)
{
    NSLog(@"%u", (unsigned int)otherAudioIsPlaying);

}


ios 6.0이상부터 아래처럼 사용가능 함.

BOOL bOtherPlaying = [[AVAudioSession sharedInstance] isOtherAudioPlaying];

android.mk의 LOCAL_SRC_FILES에 wildcard 사용하기.

android.mk에서 LOCAL_SRC_FILES에 일일이 소스 파일을 적어 넣기 귀찮을 수 있다.
와일드 카드가 적용 가능하다는거..


android.mk파일안에 아래와 같이 ppp패스안에  5개의 파일이 들어가 있고
그 5개의 파일을 모드 컴파일 하려 한다면. 아래와 같이 할 것임..

LOCAL_SRC_FILES := $(LOCAL_PATH)/ppp/a1.c \
$(LOCAL_PATH)/ppp/a2.c \
$(LOCAL_PATH)/ppp/a3.c \
$(LOCAL_PATH)/ppp/a4.c \
$(LOCAL_PATH)/ppp/a5.c

아래와 같이 와일드 카드로 바꿔 처리할 수 있다.

PPP_C_FILE_LIST := $(wildcard $(LOCAL_PATH)/ppp/*.c)
LOCAL_SRC_FILES := $(PPP_C_FILE_LIST:$(LOCAL_PATH)/%=%) 

직접 만든 소스라면 사용할일이 별로 없을듯 하지만. 대량(?)으로 가져다 붙이는 경우라면
나름 편할지도..

android Accessing Private Methods

안드로이드의 Private메소드에 접근하는 방법..

package package1;


public class ABC {
    
ABC(){
        System.out.println("constructor");
    }
}



위 같은 코드가 있을때 아래와 같이 접근 가능하단다..


Class<?> c = Class.forName("package1.ABC");//full package name

Constructor<?> constructor = c.getDeclaredConstructor();
constructor.setAccessible(true);
Object o = constructor.newInstance(null);


내부클래스를 생성할 경우는.. 이렇게 접근하면 된단다.
Class<?> clazz = Class.forName("package1.Outer$Inner");



Private Method에 접근하는 방법도 있다.
아래와 같은 클래스가 있는데....

public class ABC {

  private String string = null;

  public ABC(String string) {
    this.string = string;
  }

  private String getString(){
    return this.string;
  }
}


getString함수에 접근해서 실행하고자 한다면~~
아래를 참고하자~

ABC abc = new ABC("The Private Value");

Method abcMethod = ABC.class.getDeclaredMethod("getString", null);

abcMethod.setAccessible(true);

String value = (String)abcMethod.invoke(abc, null);
    
System.out.println("value = " + value);





Screen Dim WakeLock Deprecated as of API 17

기본 코드..
mWakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, getPackageName());



대신, 아래처럼..
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

C++컴파일 경우 -Wreorder 의미

컴파일 옵션을 -Wall하면 간혹 나타나는 오류임.
생성자의 초기화 순서는 헤더에서 선언된 순서와 일치하여야 한다는 의미임.
생성자에서 초기화 할때 상수가 아닌 변수로 초기화를 해버리면 그 순서때문에
초기값이 꼬일 수 있다는 거임..

struct A {
    int i;    int j;
    A(): j (0), i (1) // here
    {
    }
};

ffmpeg의 C헤더를 C++헤더에 include할때...

1. C++ 헤더에 아래와 같이 extern 구문을 넣어줍니다.


extern "C" {
#include <libavcodec/avcodec.h>
#include <libswscale/swscale.h>
}
 

#include <libavutil/imgutils.h>

2. 컴파일 옵션의 CXXFLAGS에 -D__STDC_CONSTANT_MACROS 옵션을 추가합니다.


2013년 8월 27일 화요일

FFMpeg를 사용한 비디오 편집



[비디오파일로 부터 정보 획득]

ffmpeg -i video.avi



[비디오 파일 포멧 변환]

FFmpeg -i source_video.avi final_video.mpg
 : .avi 비디오 파일을 .mpg 파일로 변환합니다. 확장자에 따라 다양한 포멧으로 변환이 가능합니다. (예: wmv, mp4, mkv, flv, etc.)


FFmpeg -i source_video.avi input -acodec aac -ab 128kb -vcodec mpeg4 -b 1200kb -mbd 2 -flags +4mv+trell -aic 2 -cmp 2 -subcmp 2 -s 320x180 -title X final_video.mp4
 : iPod/iPhone호환을 위한 변환 처리

   Source : source_video.avi
   Audio codec : aac
   Audio bitrate : 128kb/s
   Video codec : mpeg4
   Video bitrate : 1200kb/s
   Video size : 320px par 180px
   Generated video : final_video.mp4


FFmpeg -i video_origine.avi -ab 56 -ar 44100 -b 200 -r 15 -s 320x240 -f flv video_finale.flv
 : video_origine.avi 파일을 지정된 옵션으로 Flv(플래시 동영상)파일로 변환 처리


[비디오로 부터 특정 구간 잘라내기]

ffmpeg -i sourcemovie.avi -ss 00:00:10 -t 00:00:20 -vcodec copy -acodec copy cutsection1.avi
 : sourcemovie.avi 비디오의 10초(start) 부터 20초(duration)의 시간동안의 구간을 잘라내어 cutsection1.avi파일에 저장합니다.
 : "-vcodec copy -acodec copy" 옵션은 원본과 같은 코덱 유형을 사용하라는 의미 입니다.



[비디오 파일에서 특정영역을 Crop하여 저장]

ffmpeg -i inputfile.avi -croptop 88 -cropbottom 88 -cropleft 360 -cropright 360 output.avi
 : input.avi파일로 부터 옵션으로 지정한 crop 영역을 제외한 영상을 outputfile.avi파일로 저장합니다.



[비디오 파일에 Padding영역을 지정하여 저장]

ffmpeg -i input.avi  -padtop 120  -padbottom 120  -padcolor 000000  output.avi
 : input.avi파일에서 지정된 pad영역(위에 120, 아래에 120)을 추가한 영상을 output.avi파일로 저장합니다.



[비디오 파일 합치기 - 2단계 작업]

1. cat cutsection1.avi cutsection2.avi > fullmovie.avi
   (또는  "copy /b cutsection1. avi + cutsection2. avi fullmovie.avi")
   : cutsection1.avi파일과 cutsection2.avi파일을 cat명령을 통해  fullmovie.avi로 강제로 합칩니다.

2. ffmpeg -i fullmovie.avi -sameq finished.avi
   : 정상적인 타임스탬프의 기록을 위해 다음과 같은 정리 과정을 거칩니다.



[비디오로 부터 사운드 추출]

FFmpeg -i source_video.avi -vn -ar 44100 -ac 2 -ab 192 -f mp3 sound.mp3
 : source_video.avi 비디오 파일로 부터 사운드 데이터를 추출하여 mp3파일로 저장합니다.



[비디오파일 에서 사운드 제거]

FFmpeg -i input.avi -an output.avi
 : input.avi파일에서 사운드를 제거한후 output.avi파일로 저장합니다.



[비디오파일 에서 영상 제거]

FFmpeg -i input.avi -vn -ab 128 output.mp3
 : input.avi파일에서 영상을 제거한후 output.mp3파일로 저장합니다.



[영상파일과 사운드 파일을 결합]

ffmpeg -i son.wav -i video_origine.avi video_finale.mpg
 : son.wav 사운드 파일과 video_origine.avi 비디오 파일을 합쳐서 video_finale.mpg로 저장합니다.



[Wav파일을 Mp3로 변환]

FFmpeg -i son_origine.avi -vn -ar 44100 -ac 2 -ab 192 -f mp3 son_final.mp3



[오디오 볼륨 조정]

FFmpeg -i -vol -acodec



[비디오파일의 영상을 순차적인 이미지들로 저장]

FFmpeg -i video.mpg image%d.jpg
 : video.mpg파일의 영상을 여러개의 이미지 파일로 나누어 저장합니다.(image0.jpg ~ image??.jpg)

FFmpeg -i video.mpg  -r 1 -t 4  image%d.jpeg
 : -r옵션을 사용 함으로 초당 이미지를 얻을 수 있습니다. -t 4 오션으로 4초동안 4장의 이미지를 저장합니다.




[이미지 파일들로 부터 비디오파일 생성]

FFmpeg -f image2 -i image%d.jpg video.mpg
 : 현재 폴더에 존재하는 image%d.jpg 파일이름 형식을 가지는 순차 이미지들을 video.mpg파일로 변환합니다.



[비디오 파일을 에니메이션 Gif파일로 변환 저장]

FFmpeg -i source_video.avi gif_animated.gif
 : source_video.avi 비디오 파일을 gif_animated.gif 에이메이션 GIF파일(uncompressed)로 저장합니다.