FFMPEG 인코딩시 실시간 로그중 frame수치값만 추출하고싶은데 여러가지로 막힙니다.도움부탁드립니다.
안녕하세요?
일단 제시스템은
CentOS6.2 , ffmpeg는 yum방식을 통해서 설치했습니다.
ffmpeg-php까지 겨우 설치에 성공했는데.. 정작 큰문제는 프로그래시바를 구현하기위해서
인코딩중 실시간 로그가 모니터로 출력되는 수치값중 하나를 추출해서 텍스트에 저장을 하고싶거든요?
KLDP의 파일첨부방식이 좀햇갈려서 그림이 제대로 올라가는지 잘은몰르겠지만..
첫번째 첨부그림이 인코딩이 시작될때 터미널에서 인코딩되고있는 상황을 캡쳐하였습니다.
빨간 박스부분의 frame수치값을 실시간으로 텍스트에 저장을 해야하는데요.
ffmpeg -i test.avi -acodec aac -strict experimental -ac 2 -ab 160k -s 480x320 -vcodec libx264 -vpre slow -vpre ipod640 -b 1200k -f mp4 new.mp4 2> log.txt
이렇게 주고나면 log.txt에 아래의 그림처럼 정보들이 계속 추가되더라구요.
grep 'frame=' log.txt | awk '{print $2}'
위명령어를 주면 제대로 안먹히더라구요..
왜그런가 vi로 log.txt를 열어봤더니..
아래의 그림처럼 ^M 이 추가되서그렇더라구요...
log.txt는 인코딩이 끝날때까지 계속적으로 정보를 추가하기때문에 ^M 관련된 치환작업은 데이터손실이 발생할수까봐서
손도못대겠고요..
ffmpeg-php의 frameCount메서드를 이용하면 인코딩을 하지않아도 해당영상의 토탈프레임을 뽑아낼수있거든요?
확인해보니 인코딩이 끝났을때의 프레임 수치와 토탈프레임수치가 정확히 맞아떨어지더라구요..
현재 프레임하고 토탈프레임하고 계산좀하면 인코딩프로그래시바 구현이 가능할것같은데..
현재 기록중인 프레임수치만 빼온다는게 말처럼 쉽지가않네요..
============================
제가 생각한방식은 빨간박스의 프레임수치(기록중인 마지막 수치값만)만 텍스트에 저장하되..
현재 프레임수치만 실시간으로 저장되게끔 하고싶거든요..
이래저래 안되면 ^M 없이 저장되게끔 명령어가 존재하는지..
( 2> log.txt 이사이에 무언가의 추가옵션으로 ^M없이 저장이 가능한지요?)
두서없이 주절거려서 죄송합니다.
첨부 | 파일 크기 |
---|---|
222.PNG | 46.54 KB |
죄송합니다.이그림만 봐주시면감사하겠습니다.
글수정을몰르겠어서 그림을 새로올립니다.
http://kldp.org/files/AAA_1.png
옵션을 조금변경했더니 ..
인코딩옵션이후의 명령옵션을 바꿔봤습니다.
1~4번 필드까지 옵션을 넣고 인코딩을 시작한후 q를 눌르니
frame= 163 fps=0
이렇게 나오더라구요.. 물론 2번필드만 넣으면 163이라는 값이나오더라구요..
조금이나마 희망을 보긴한것같습니다.
q눌러야만 콘솔화면에 기록되는 결과방식을
이왕이면 ffmpeg가 기록하는 실시간 값을 실시간으로 frame의 수치값으로 저장했으면 좋겠는데..
마지막에 명령어 더추가하면..
근데 여긴 리플삭제하는방법을 몰르겠네요..ㅠㅠ
ffmpeg -i test.avi new mp4 2>&1 | grep frame= | awk '{print $1,$2}' > log.txt
이렇게하고 인코딩을 시작하게돼면 콘솔화면에는 그냥 커서만 깜박거립니다.
그리고 log.txt파일이 생성되어있구요.(이때는 빈파일상태)
q를 눌러서 인코딩을 중지하게돼면 결과가 콘솔에 나오지않고 텍스트파일에
frame=20
이렇게 달랑 파일이 저장되어있습니다.
아마 인코딩 시작부분의 초반 프레임이 저장이된것같은데..
전 콘솔화면에 뿌려지는 "마지막 수치값"만 덮어씌우는 형식으로 저장이 되었으면 좋겠거든요.
마치 tail -f 처럼 최근 메세지만 콘솔에 뿌려지는걸 저장하고싶은것처럼 말이죠..
이게 정말 쉽지가 않네요..ㅠㅠ
ffmpeg -i test.avi new mp4 2>&1 | grep frame= | tail | awk '{print $1,$2}' > log.txt
위명령어 중간에 tail 명령어를 넣어봤는데요. 이게 안먹히더라구요..
혹시나해서 다른 문서로 테스트해봤는데 잘되더라구요..
아마 기록되는 문장 마지막에 줄바뀜 ^M <- 이놈이 들어가서 tail 명령어가 안먹히는듯하더라구요.
실시간 기록되는 파일을 치환작업으로 지울수있다해도 빡샐것같고..
===========
콘솔에 뿌려지는 값중 원하는 필드값만 변수에 그때그때 저장해서 텍스트파일에 저장하는방법도 가능하지않을까싶은데요
뭐 이런저런 잡생각만 드는데 해결책은 안보이네요
핑값은 ^M 이 없던데..
ping 192.168.0.1 2>&1 > log.txt
이렇게하고 vi로 열어보면 ^M이없더라구요..
ffmpeg하고 저장방식이 뭔가 달라보이는데..
왜 ffmpeg만 ^M이 들어가면서저장이되는지..
\n 없이 \r 만 사용해서 콘솔 표시정보를 '제자리
\n 없이 \r 만 사용해서 콘솔 표시정보를 '제자리 바꿔치기' 하는 방식이기 때문에,
line-feed 를 필요로하는 유틸이 원하시는 대로 동작하지 않습니다.
\r 을 \n 으로 바꾸는 뭔가를 중간에 끼워넣어서 해결하시려면,
그 뭔가 역시 \n 을 기준으로 삼지않는 아주 단순한 놈이어야 하고... tr 정도.
답변주셔서감사합니다.
콘솔표시 과정 방식을 잘몰랐는데
그정보만으로도 상당히 도움이되었습니다.
댓글 달기