오티스의개발일기

[FFMPEG] ffmpeg 오디오 변환중 오류 Automatic encoder selection failed for output stream #0:0. Default encoder for format mp3 (codec mp3) is probably disabled. Please choose an encoder manually. 해결완료 본문

개발/FFmpeg

[FFMPEG] ffmpeg 오디오 변환중 오류 Automatic encoder selection failed for output stream #0:0. Default encoder for format mp3 (codec mp3) is probably disabled. Please choose an encoder manually. 해결완료

안되면 될때까지.. 2023. 1. 15. 21:33
728x90


< 이전글

2023.01.15 - [개발/react-native] - [REACT-NATIVE] ffmpeg 사용을 위한 Video CurrentTime 조작하기

 

[REACT-NATIVE] ffmpeg 사용을 위한 Video CurrentTime 조작하기

< 이전글 2023.01.14 - [개발/FFmpeg] - [FFMPEG] 계획 및 ffmpeg-kit-react-native 를 활용하여 영상프레임마다 잘라 클라이언트에 보여주기 [FFMPEG] 계획 및 ffmpeg-kit-react-native 를 활용하여 영상프레임마다 잘라

otis.tistory.com


 


다음글 >

2023.01.16 - [개발/react-native] - [REACT-NATIVE] ffmpeg 를 활용하여 받아온 비디오 react-native 에서 컨트롤하고 정보 보여주기

 

[REACT-NATIVE] ffmpeg 를 활용하여 받아온 비디오 react-native 에서 컨트롤하고 정보 보여주기

< 이전글 2023.01.15 - [개발/react-native] - [REACT-NATIVE] ffmpeg 사용을 위한 Video CurrentTime 조작하기 [REACT-NATIVE] ffmpeg 사용을 위한 Video CurrentTime 조작하기 < 이전글 2023.01.14 - [개발/FFmpeg] - [FFMPEG] 계획 및 ffmp

otis.tistory.com


 

 

오늘은 받아온 비디오에서 오디오를 추출하려하였다.

추출 하려고하였지만 제목에나온 에러가 발생하였다.....

일단 오늘한 작업을 먼저 보여주도록 하겠다.

 

 

일단 그전에 getFrames 에 있는 FFmpegKit.executeAsync 함수를 따로빼어서 공통적으로 사용할수있도록 작업하였다.

 

const excute = (ffmpegCommand, outputPath,successCallback, errorCallback) => {
  FFmpegKit.executeAsync( // FFmpegKit 라이브러리의 비동기 실행함수 시작
  ffmpegCommand, // 작성한 커맨드를 실행 이해하기 쉽게 풀면 sql query 날렸다 생각하면 쉬움 
  async session => { // 비동기후 response 반환
    const state = FFmpegKitConfig.sessionStateToString( // 상태를 String 형태로 변환
      await session.getState(), // 세션의 상태를 받아옴
    );
    const returnCode = await session.getReturnCode(); // 세션의 response 확인
    const failStackTrace = await session.getFailStackTrace(); // 실패시 호출이 시작된시점부터 예외가 발생할때까지의 함수 목록반환 (디버깅용임)
    const duration = await session.getDuration(); // 걸린 시간 반환

    if (ReturnCode.isSuccess(returnCode)) { // 성공적으로 처리되었다면
      console.log(
        `Encode completed successfully in ${duration} milliseconds;.`, // 처리되었다는 log 반환
      );
      console.log(`Check at ${outputPath}`); // 프레임이 저장된 위치
      successCallback(outputPath); // 이 getFrame 을 호출한 부분으로 callBack 쉽게 말하면 resolve 와 비슷하다
    } else { // 실패시 상태 반환
      console.log('Encode failed. Please check log for the details.');
      console.log(
        `Encode failed with state ${state} and rc ${returnCode}.${
          (failStackTrace, '\\n')
        }`,
      );
      errorCallback(); // reject 와 비슷한 에러 콜백 반환
    }
  },
  log => { // 로그
    console.log(log.getMessage());
  },
  statistics => { // 통계 같음
    console.log(statistics);
  },
).then(session =>
  console.log(
    `Async FFmpeg process started with sessionId ${session.getSessionId()}.`, // 세션 아이디
  ),
);
}

 

 

이렇게 해놓으면 오디오나 비디오 작업할때 excute 만 사용하면 코드량도 줄고 가독성도 좋아지기때문에 작업하였다.

길게설명했지만 간단하게 리팩토링한거다 ㅋㅋㅋ

 

이제 문제가 되는 오디오 출력쪽을 살펴보도록하겠다.

 

  static getAudio(
    localFileName,
    videoURI,
    successCallback,
    errorCallback,
  ) {
    let outputPath = `${RNFS.CachesDirectoryPath}/${localFileName}.mp3`; // 업로드된 파일을 캐싱하여 각 초마다 저장했을때의 path 를 등록
    const ffmpegCommand = `-ss 0 -i ${videoURI} ${outputPath}`;
    console.log(videoURI)
    excute(ffmpegCommand, outputPath,successCallback, errorCallback);
  }
}

이렇게 작업하였다 

단순하다 출력을 mp3 로 하겠다고하면 알아서 오디오부분만 추출할수있다..

근데 저런 오류가떴다

 

Automatic encoder selection failed for output stream #0:0. Default encoder for format mp3 (codec mp3) is probably disabled. Please choose an encoder manually.

Automatic encoder selection failed for output stream #0:0. Default encoder for format mp3 (codec mp3) is probably disabled. Please choose an encoder manually.

 

그니까 이게 #0:0 처음시작할때 오디오로 인코딩하는것을 실패했으니 수동으로 인코딩 옵션을 적으라는 소리이다.

 

그래서 

ffmpegCommand 부분중 아웃풋 전에 코드를 추가시켰다.

 

  static getAudio(
    localFileName,
    videoURI,
    successCallback,
    errorCallback,
  ) {
    let outputPath = `${RNFS.CachesDirectoryPath}/${localFileName}.mp3`; // 업로드된 파일을 캐싱하여 각 초마다 저장했을때의 path 를 등록
    const ffmpegCommand = `-ss 0 -i ${videoURI} -map 0:v -c:v copy ${outputPath}`;
    console.log(videoURI)
    excute(ffmpegCommand, outputPath,successCallback, errorCallback);
  }
}

 

 

이렇게 해서 실행하면

[mp3 @ 0x7fa3fd1da750] No audio stream present.

[mp3 @ 0x7fa3fd1da750] No audio stream present.

오류내역 중간에 이러한 에러를 볼수있다.

한마디로 오디오 파일이 없다는것이다

이유는 모르겠지만 영상을 다운받았을때 오디오파일이 깨져있거나 뭐 그러한 문제가 있는것같다

 

뭐 고로...코드문제는 아닌거같아 다행이지만

원래 하려던 작업은 애초에 촬영자체를 어플리케이션 자체에서하고 마치 틱톡처럼 사용할수있는 그러한 어플리케이션을 만들계획을 하고있었기 때문에 이작업이 끝나고 카메라쪽 작업을 할예정이였다.

 

이문제가 크게작용하진 않겠지만 작업순서가 뒤틀려질거같은 두려움이든다...

ㅠㅠㅠㅠㅠㅠㅠ

 

일단 대체방법은 정상적인 비디오를 다운받는것부터 해야겠다.

일단 영상여러가지를 다운받아보고 그래도 안된다면 카메라쪽 작업을 해야겠다... 지옥문이 열릴듯하다 ㅎㅎ

 

이것으로 이번 포스팅은 마치도록하겠다.!

 


+++++++++++++++++ 추가 ++++++++++++++++++++

 

 

드디어 해결이되었다.....ㅋㅋㅋㅋㅋㅋㅋㅋㅋ현재시간 새벽 3시 26분... 

일단 다른 영상을 다운로드 받아 새로 테스트 하였지만 아무런 효과가 없었다.

그래서 유튜브에서 추출한 영상은 다 이런가....? 했다

그래서 두번째시도는 직접 핸드폰과 연결을하여 그전에 찍어둔 영상을 올려보도록 해보았다.

역시 동작하지않았다.

 

그래서 영상이아닌 코드에 문제가있다는것을 판단하고

다른 에러 로그를 찾아 그것을 검색하였고

결과적으로 그냥 단순히 맥북에서 사용하는 ffmpeg 과는 다르게 중간에 다른 필터를 넣어줘야 동작하는것이였다.

 

  const ffmpegCommand = `-ss 0 -i ${videoURI} -acodec copy -map 0:a:0 -vn -f rawvideo ${outputPath}`;

 

이것이 동작하는 코드이다

 

일단 너무 졸려서 -acodec 에 대한 내용은 다음 시간에 다루도록 하겠다...

일단 되니까 편히 잘수있을거같다 ㅋㅋ

 

 


다음글 >

 

2023.01.16 - [개발/react-native] - [REACT-NATIVE] ffmpeg 를 활용하여 받아온 비디오 react-native 에서 컨트롤하고 정보 보여주기

 

[REACT-NATIVE] ffmpeg 를 활용하여 받아온 비디오 react-native 에서 컨트롤하고 정보 보여주기

< 이전글 2023.01.15 - [개발/react-native] - [REACT-NATIVE] ffmpeg 사용을 위한 Video CurrentTime 조작하기 [REACT-NATIVE] ffmpeg 사용을 위한 Video CurrentTime 조작하기 < 이전글 2023.01.14 - [개발/FFmpeg] - [FFMPEG] 계획 및 ffmp

otis.tistory.com


 

728x90
Comments