code

FFmpeg를 사용하여 iOS에서 작성하는 동안 fMP4를 HLS로 트랜스 코딩

codestyles 2020. 12. 26. 10:04
반응형

FFmpeg를 사용하여 iOS에서 작성하는 동안 fMP4를 HLS로 트랜스 코딩


TL; DR

조각이 iOS 장치에서 FFmpeg를 사용하여 작성되므로 fMP4 조각을 TS 세그먼트 (HLS 용)로 변환하고 싶습니다.

왜?

원활한 HD 사본을 로컬로 유지하면서 iOS에서 라이브 업로드를 달성하려고합니다.

내가 시도한 것

  1. AVAssetWriter각각 8 초 동안 쓰는 롤링 s, 그런 다음 FFmpeg를 통해 MP4를 함께 연결합니다.

    무엇이 잘못 되었는가-때때로 오디오 및 비디오에 오류가 있습니다. 이에 대한 세 가지 이유를 확인했습니다.

    1) AAC 인코더로 작성된 오디오 용 프라이밍 프레임으로 인해 간격이 생깁니다.

    2) 비디오 프레임 길이는 33.33ms이고 오디오 프레임 길이는 0.022ms이므로 파일 끝에 정렬되지 않을 수 있습니다.

    3) 맥 OS에 대한 정확한 프레임 인코딩 현재 부족하지만, iOS 용 사용할 수 없습니다 여기에 세부 사항

  2. FFmpeg는 원시 오디오가 포함 된 대용량 비디오 전용 MP4 파일을 TS 세그먼트로 다중화합니다. 작업은 Kickflip SDK를 기반으로했습니다.

    무엇이 잘못 되었는가 -가끔씩 오디오 전용 파일이 업로드되고 동영상은 전혀 표시되지 않습니다. 사내에서 재현 할 수는 없었지만 사용자가 자신이했다고 생각하는 것을 기록하지 않았을 때 사용자는 상당히 당황했습니다. 또한 TS 세그먼트에 타임 스탬프가 잘못 표시된 것처럼 최종 세그먼트를 정확하게 찾는 데 문제가있었습니다.

지금 내가 생각하는 것

애플은 올해 (2016 년) WWDC에서 fMP4를 추진하고 있었고 그 전에는 그다지 살펴 보지 않았습니다. fMP4 파일을 읽고 쓰는 동안 재생할 수 있기 때문에 FFmpeg가 파일을 작성 하는 동안 트랜스 코딩하는 것이 가능할 것이라고 생각했습니다. 파일이 완성되었습니다.

그러나 나는 FFmpeg C API에 대해 충분히 익숙하지 않고 시도 # 2 내에서 간단히 사용했습니다.

내가 당신에게 필요한 것

  1. 이것이 가능한 해결책입니까? 내가 실제로 이것을 수행 할 수 있는지 알기 위해 fMP4에 익숙한 사람이 있습니까?
  2. AVFoundationFFmpeg로 파이프 할 수 있도록 파일 내에 조각 작성을 완료 했는지 어떻게 알 수 있습니까?
  3. 디스크의 파일에서 한 번에 청크 데이터를 가져 와서 FFmpeg로 전달하고 TS 세그먼트를 내보내도록하려면 어떻게해야합니까?

엄밀히 말하면 fmp4에 h264 + aac가 포함 된 경우 트랜스 코딩 할 필요가 없으며 샘플 데이터를 TS로 다시 패키징하면됩니다. ( ffmpeg -codec copy또는 gpac 사용 )

Wrt. 정렬 (1.2)이 모든 것이 인코더 설정 (프레임 속도, 샘플 속도 및 GOP 크기)에 따라 달라진다고 생각합니다. 오디오와 비디오가 조각 경계에서 정확히 정렬되도록하는 것은 확실히 가능합니다 (예 : 이 표 참조 ). iOS를 대상으로하는 경우 HLS 프로토콜 버전 3 (또는 4)을 사용하여 타이밍을보다 정확하게 표현하는 것이 좋습니다 . 또한 오디오와 비디오를 개별적으로 스트리밍 할 수 있습니다 (다중화되지 않음).

나는 ffmpeg가 라이브 fmp4 스트림 (예 : 장기 실행 HTTP POST 사용)을 푸시 할 수 있어야한다고 생각하지만, 플레이 아웃에는 의미있는 작업을 수행하기 위해 원본 소프트웨어 가 필요합니다 (예 : HLS로 스트리밍).

참조 URL : https://stackoverflow.com/questions/38227301/transcoding-fmp4-to-hls-while-writing-on-ios-using-ffmpeg

반응형