'ffmpeg'에 해당되는 글 2건

  1. 2017.09.12 [FFMPEG] Command 사용법 및 예제 10
  2. 2013.08.21 [android] FFmpeg 빌드 for android with shared-lib

[FFMPEG] Command 사용법 및 예제

개발 2017. 9. 12. 14:35

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

ffmpeg는 오픈소스이면서, 비디오/오디오 관련한 많은 기능을 제공하고 있으며, 성능또한 상당히 좋은 편이다. 

ffmpeg는 크게 4가지로 분류하면 다음과 같다. 


1. ffmpeg : command line 도구 ( 동영상 크기및 코덱을 변경하경 할수 있다. ) 

2. ffserver : 동영상 streaming을 위한 서버 

3. ffplay : SDL 이라는 오픈소스 기반으로 player를 해주는 컴포넌트 

4. ffprobe : 간단한 멀티미디어(동영상) 분석도구 


이중에서 가장 기본이되고 방대한것이 바로 ffmpeg command line 인데, 

이걸로 무엇을 할 수 있는지 알아 보자. 


[사전준비] 

각 OS별로 컴파일된 binary를 사용해서 command를 연습해 볼 수 있다. 

https://ffmpeg.org/download.html 에서 OS별로 선택해서 다운받으면 된다. source code를 다운받지 말고 빌드된 binary를 받으면 된다. 현재 최신버전은 3.3.3 입니다. 



[기본 cmd 구조] 

ffmpeg [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url} ...


 * global_options 

  - 입력, 출력 파일에 모두 적용 되는 옵션 

  -y, -n 처럼 강제로 output을 덥어 쓸지 정하는 옵션이 있는데, 몇가지 없음. 


 * input_file_options & input_url  

  - input에 사용되는 옵션으로 -i 앞에 위치한다. 

  - input이 여러개가 사용될 경우, 각 옵션들은 각각 input에 적용된다. 


 * output_file_options & output_url 

  - output 파일이름과 옵션들. 

  - 출력을 많이 변경하므로 여기에 옵션이 많이 사용된다. 


 * 참고 : 기본문서 

  - https://ffmpeg.org/ffmpeg.html : 간단문서 

  - https://ffmpeg.org/ffmpeg-all.html : 자세한 문서 

  - https://trac.ffmpeg.org/wiki : ffmpeg 위키문서 (버그, 가이드, 기타등등 ) 



case study


 * mp4 파일에서 비디오 제거하기 ( = audio 추출하기 ) 

ffmpeg -i input.mp4 -vn output.mp4 

 - 입력파일로 input.mp4 파일을 지정 

 -an : disable audio recording

 이렇게 하면 input파일에서 오디오 track을  decode 하고, 다시 encode 하는 과정을 거치게 된다. 그래서 인지 audio bitrate가 127KBit/s 에서 71KBit/s으로 변경되었다. 오디오 트랙을 그대로 보존하고 싶으면 아래처럼 옵션을 추가하면 된다. 추가로 encode/decode 과정이 없어서 속도가 더 빠르게 된다. 

ffmpeg -i input.mp4 -acodec copy -vn output.mp4

- acodec copy : audio를 디코딩/인코딩 하지 않고 그냥 copy 하라는 의미 

ffmpeg 명령어중에 같은 의미이지만 alias로 여러가지 방식으로 표현이 가능한데, -acodec copy은 다음과 같이 여러가지 방식으로 표한할수 있다. 

-c copy : 코덱을 그냥 카피하라는 의미, 오디오 비디오 모두에 해당한다. 

-acode copy : 오디오코덱을 카피하라는 의미 ( -vcode 은 비디오라는 뜻 ) 

-c:a copy : 코덱인데 오디오라는 의미 ( -c:v 이면 비디오라는 뜻 ) 


동영상에서 음악을 mp3 형식으로 뽑아내고 싶으면 아래와 같이 할 수있다. 

ffmpeg -i input.mp4 -vn output.mp3

 output 파일의 형식을 mp3로 하면 내부에서 자동으로 디코딩을 한후에 mp3 코덱으로 인코딩을 수행한다. 아래의 명령과 같은 의미가 된다. 

ffmpeg -i input.mp4 -acodec mp3 output.mp3

위와 똑같고 명시적으로 encoding할 codec을 알려주었다. 


* mp4 파일에서 특정 구간만 짤라서 뽑아 보자. 

ffmpeg -i input_20s.mp4 -vn -ss 5 -to 10 -c copy ouput_5_10.mp4

 -ss 5 : 시작 위치를 지정한다. (즉, 5초부터 시작한다. )

 -to 10 : Stop writing the output at position ( 즉, 10초까지만 사용한다. )

20초짜리 동영상파일에서 비디오를 제거하고(-vn) 5초부터 10초까지의 audio 파일만 crop 하는 명령이다. 


* 끝부분을 부드럽게 crop 하기 위해서 fade out 효과를 주면서. 

ffmpeg -i input_60s.mp4 -to 30 -filter_complex "afade=t=out:st=28:d=2" output_fadeout.mp3

-to 30 : 처음부터 30초까지 짜르라는 의미

-filter_complex : 복합필터를 적용하라는 뜻 

"afade=t=out" : fade효과인데 타입(t)은 서서히 줄어드는 효과(out) 

st=28 : (startTime) 28초부터 시작해서 

d=2 : (duration) 2초동안

명령이 조금씩 길어지는데, 위의 설명을 천천히 보면 알 수 있다. 위에서는 처음부터 30초까지 짤르면서 fade-out 효과를 주었는데, 10초부터 30초까지 중간을 짜르면서 앞에 fade-in 효과를 추가하고 싶으면 어떻게 할까? 

ffmpeg -i input.mp4 -ss 10 -to 30 -filter_complex "afade=t=in:st=10:d=1,afade=t=out:st=29:d=1" output.mp3

점점 복잡해진다. ^^; 


* 오디오 파일을 반복해서 붙여 볼까? 

ffmpeg -stream_loop 1 -i input.mp3 -c copy output_loop.mp3

-stream_loop n : n번 반복하라는뜻, 0은 반복 없음. -1은 무한 반복

위에있는 stream_loop는 입력파일 앞에 추가한 input_file에 대한 옵션이다. ffmpeg는 입력을 받아서 출력으로 쓰는 형식인데, 입력은 반복해주면 출력결과가 반복(loop)이 되는 것이다. 


* 오디오파일1, 오디오파일2를 붙이고 싶으면? 

ffmepg -i "concat:input_1.mp3|input_2.mp3" output.mp3

-i 다음에 입력파일이 오는 위치인데, 이부분에 따옴표가 붙으면서 subcommand가 왔다. 

concat:file1|file2|file3...    형식으로 붙이고 싶은 많큼 파일을 붙일 수 있다. 


* 오디오파일과 비디오파일을 합쳐볼까? 

ffmpeg -i audio_only.mp3 -i video_only.mp4 -c copy ouput_mux.mp4

오디오만 있는 파일과 비디오만 있는파일 2개를 사용해서 하나의 동영상 파일로 만든다. 

2개의 입력파일 시간이 다를경우, 최종 output 길이는 긴 것으로 된다. 만약 비디오파일이 30초길이고 음악이 20초길이면 결과물 output을 play 해보면 20초까지는 동영상과 음악이 같이 나오다가 21초부터는 영상만 나오게 된다. 





:

[android] FFmpeg 빌드 for android with shared-lib

android 2013. 8. 21. 23:11

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

FFmpeg은 동영상을 인코딩/디코딩 해주는 opensource 입니다. 주요 특징은 아래와 같습니다.

라이선스 : LGPL

운영체제 : linux, window, mac-os, android 등 다수 지원 ( 개발은 linux 기반임 )

앞의 FFfast forward를 의미함.

대부분의 동영상 프로그램에서 사용됨. ( 곰플레이어, KMP, MX 플레이어 등 )

 

 

FFmpegandroid 용으로 컴파일 하면서 찾아본 자료 정리와 삽질 내용 정리합니다. 관련 글을 읽어본 후 따라하면 항상 안되는 경우가 발생하는데, 검색해보면 대부분 나오더군요. 제가 격은 문제들은 아래 트러블 슈팅으로 정리 하였습니다.

 

[ 환경 ]

OS : Window에서  Cygwin 으로

Android-NDK : r8e ( 현재는 r9 나와 있네요 )

목적 FFmpegAndroid shared-lib 으로 컴파일 ( static 이었으면 좋았을 것을 )

FFmpeg 버전 : 1.2.2  (http://ffmpeg.org/download.html )

 

[ 관련 글 ]

 

Android 동영상 플레이어 개념

http://helloworld.naver.com/helloworld/8794

 

Android-pub 강좌

http://www.androidpub.com/index.php?mid=android_dev_info&page=1&search_target=tag&search_keyword=FFmpeg&document_srl=1645684

http://www.androidpub.com/index.php?mid=android_dev_info&page=1&search_target=tag&search_keyword=FFmpeg&document_srl=1646144

http://www.androidpub.com/index.php?mid=android_dev_info&page=1&search_target=tag&search_keyword=FFmpeg&document_srl=1646529

http://www.androidpub.com/index.php?mid=android_dev_info&page=1&search_target=tag&search_keyword=FFmpeg&document_srl=1646540

http://www.androidpub.com/1690105

 

*vec.io 의 글 (영문) :

 https://vec.io/posts/how-to-build-ffmpeg-with-android-ndk

 

 

[ 트러블 슈팅 ]

 

l  Config 실패할 경우

원인 : 줄변경하기 위해서 \ 을 사용하는데 \ 뒤에 space 가 있으면 안됨.

이것땜에 시작부터 2~3시간 삽질함.

 

l  config 성공하고 make 실패시

원인 : 생성된 config.h 헤더파일에 줄변경 문자가 포함된 경우가 있음.

참고 : http://stackoverflow.com/questions/14199888/cygwin-make-errors-ffmpeg-compile-with-ndk

Ultra-editor 에서도 않보임. 그냥 eclipse에서 보면 줄변경 되어 있음. 콘솔인경우 VI 에디터로 바로 지우면 편리함. 계속 삽질 ㅠ

 

l  share파일이 libavcodec.so.54 이렇게 생성될 때  

원인 : 1.2.2 버전의 share 모드 스크립트가 그렇게 생겨 먹었음.

참고 :

http://stackoverflow.com/questions/14521588/native-libraries-so-xy-failing-to-link-at-runtime

http://stackoverflow.com/questions/14522510/simple-string-substitution-in-makefile/

수정 : 참고는 그냥 참고일뿐, library.mak 파일에서 link 만드는 부분 수정하면 됨. ( install-lib$(NAME)-shared 로 검색 ) 그리고 configure 파일에서 SLIBNAME_WITH_MAJOR 찾아서 수정하면됨. 삽질은 멈추지 않는다.

 

 

[ 마치면서 ]

윈도우에서 하다가 막혀서 맥에서 해보니 맥이 android NDK 개발하는데 더 좋은 환경인 것 같습니다. 주변에서도 맥에서 android 개발하는 사람들이 꽤 되던데 저도 고려중에 있습니다.

 

[ 기타 참고 ]

https://code.google.com/p/javacv/downloads/list

 

 

 

 



: