마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

빈 mp4 파일에다가 mp3 파일을 넣어줄 수 있나요?

0 추천
File mediaFile = new File(mediaStorageDir.getPath() + File.separator + "VID_"+ timeStamp + ".mp4");

 

이런식으로 그냥 빈 mp4  파일만 만들어줬거든요 여기에다가 mp3 파일을 mediaCodec이나 mp4parser등 으로 넣어서 만들어줄 수 있을까요??
알파고 (4,320 포인트) 님이 2018년 10월 24일 질문

1개의 답변

+1 추천
 
채택된 답변

빈파일을 만드는건 아무 의미 없는 일이구 ffmpeg를 통해  컨테이너 변환을 하는게 제일 좋을 듯 합니다. trans coding을 하는 것이 아니라. 구조만 바꾸는거라 속도 이슈도 없습니다. 

    MediaMuxer 를 이용하는 방법도 있긴 한데,  안드로이드에서 제공하는 먹서는 오디오가 mp3인것을 공식적으로 지원하지 않아서,    MediaCodec, MediaExtractor를 이용해 mp3를 aac로 변환해서 넣어야 하거든요...

 

 

익명사용자 님이 2018년 10월 25일 답변
알파고님이 2018년 10월 26일 채택됨
mp3파일을 aac로 포맷주고 이걸다시 mp4 동영상파일로 변환하는게 가능하다는건가요?? 그럼 이때 혹시 surface를 안쓰거나 이미지 한장을 surface로 쓸 수 있나요??
* mp3파일을 aac로 포맷주고 이걸다시 mp4 동영상파일로 변환하는게 가능하다는건가요??
=> 네 가능합니다.
Mp3를 MediaExtractor를 통해 패킷단위로 읽어 MediaCodec을 통해 디코딩하면 pcm이 나옵니다.
이 pcm을 MediaCodec을 써서 aac로 인코딩하면 aac 데이터가 생성되고 이걸 MediaMuxer를 통헤 저장하는 방식입니다.

* 그럼 이때 혹시 surface를 안쓰거나 이미지 한장을 surface로 쓸 수 있나요??
=>MediaMux 보시면 아시겠지만  surface 자체를 쓸 필요가 없습니다.
비디오 데이터가 필요하면 비디오 트랙을 설정하고,  h264데이터를 넘겨주시면 비디오가 들어갑니다. 이미지 한장을 계속 보여주려면 이미지 한장을 h264데이터로 변경해서  MediaMuxer로  넘겨주면 됩니다.
답변 정말 감사드립니다. 아직 머리에 안들어와서 그런데요,
디코딩 => mp3 에서 aac로 포맷하고 => 미디어 코덱, 먹서로 인코딩

디코딩 => aac 에서 mp4로 포맷 => 미디어 코덱,먹서로 인코딩 후 마무리 이 과정이란 말씀이신가요? ? 질문 자꾸해서 죄송합니다..ㅠ
복잡하게 생각하신듯 한데, MediaMuxer는 입력된 스트림을 mp4, 3gpp, webm 등의 컨테이너로 만드는 역활을 하는 것으로 이걸 사용하면 mp4를 쉽게(?) 만들 수 있습니다.
문제는  MediaMuxer 의 경우 오디오 코덱 중  aac는 지원하지만 mp3는 지원하지 않는다는 겁니다.

따라서 MediaMuxer를 쓰려면 오디오 데이터를 aac로 변환해야 합니다.

mp3를 aac로 변환하기 위해선
1. mp3컨테이너에서 실제 오디오 데이터를 한 sample씩 뽑아 내야 합니다.
 -> MeidaExtractor(readSampleData)를 통해 추출 가능합니다.
2. 뽑아낸  sample을 pcm으로 변환해야 합니다.
 -> MediaCodec을 통해 sample을 pcm으로 디코딩하는 방식을 사용하면 가능합니다.
3. pcm데이터를 aac로 변환해야 합니다.
 -> MediaCodec 을 통해 pcm데이터를 aac로 인코딩하면 됩니다.

1~3 이 과정을 거치면 mp3의 sample 데이터가 aac sample단위로 계속 변환될 겁니다.

이 데이터를 mediamuxer.writeSampleData 로 넘겨주면, aac 샘플데이터가 mediamuxer 에서 설정한 형식의 컨테이너로 들어간다는 애기입니다.
와 진짜 감사드립니다 ㅠㅠ 모두 이 정보가 많은 도움이 될거에요
...