FFmpeg를 사용하여 iOS에서 작성하는 동안 fMP4를 HLS로 트랜스 코딩
TL; DR
조각이 iOS 장치에서 FFmpeg를 사용하여 작성되므로 fMP4 조각을 TS 세그먼트 (HLS 용)로 변환하고 싶습니다.
왜?
원활한 HD 사본을 로컬로 유지하면서 iOS에서 라이브 업로드를 달성하려고합니다.
내가 시도한 것
AVAssetWriter
각각 8 초 동안 쓰는 롤링 s, 그런 다음 FFmpeg를 통해 MP4를 함께 연결합니다.무엇이 잘못 되었는가-때때로 오디오 및 비디오에 오류가 있습니다. 이에 대한 세 가지 이유를 확인했습니다.
1) AAC 인코더로 작성된 오디오 용 프라이밍 프레임으로 인해 간격이 생깁니다.
2) 비디오 프레임 길이는 33.33ms이고 오디오 프레임 길이는 0.022ms이므로 파일 끝에 정렬되지 않을 수 있습니다.
3) 맥 OS에 대한 정확한 프레임 인코딩 현재 부족하지만, iOS 용 사용할 수 없습니다 여기에 세부 사항
FFmpeg는 원시 오디오가 포함 된 대용량 비디오 전용 MP4 파일을 TS 세그먼트로 다중화합니다. 작업은 Kickflip SDK를 기반으로했습니다.
무엇이 잘못 되었는가 -가끔씩 오디오 전용 파일이 업로드되고 동영상은 전혀 표시되지 않습니다. 사내에서 재현 할 수는 없었지만 사용자가 자신이했다고 생각하는 것을 기록하지 않았을 때 사용자는 상당히 당황했습니다. 또한 TS 세그먼트에 타임 스탬프가 잘못 표시된 것처럼 최종 세그먼트를 정확하게 찾는 데 문제가있었습니다.
지금 내가 생각하는 것
애플은 올해 (2016 년) WWDC에서 fMP4를 추진하고 있었고 그 전에는 그다지 살펴 보지 않았습니다. fMP4 파일을 읽고 쓰는 동안 재생할 수 있기 때문에 FFmpeg가 파일을 작성 하는 동안 트랜스 코딩하는 것이 가능할 것이라고 생각했습니다. 파일이 완성되었습니다.
그러나 나는 FFmpeg C API에 대해 충분히 익숙하지 않고 시도 # 2 내에서 간단히 사용했습니다.
내가 당신에게 필요한 것
- 이것이 가능한 해결책입니까? 내가 실제로 이것을 수행 할 수 있는지 알기 위해 fMP4에 익숙한 사람이 있습니까?
AVFoundation
FFmpeg로 파이프 할 수 있도록 파일 내에 조각 작성을 완료 했는지 어떻게 알 수 있습니까?- 디스크의 파일에서 한 번에 청크 데이터를 가져 와서 FFmpeg로 전달하고 TS 세그먼트를 내보내도록하려면 어떻게해야합니까?
엄밀히 말하면 fmp4에 h264 + aac가 포함 된 경우 트랜스 코딩 할 필요가 없으며 샘플 데이터를 TS로 다시 패키징하면됩니다. ( ffmpeg -codec copy
또는 gpac 사용 )
Wrt. 정렬 (1.2)이 모든 것이 인코더 설정 (프레임 속도, 샘플 속도 및 GOP 크기)에 따라 달라진다고 생각합니다. 오디오와 비디오가 조각 경계에서 정확히 정렬되도록하는 것은 확실히 가능합니다 (예 : 이 표 참조 ). iOS를 대상으로하는 경우 HLS 프로토콜 버전 3 (또는 4)을 사용하여 타이밍을보다 정확하게 표현하는 것이 좋습니다 . 또한 오디오와 비디오를 개별적으로 스트리밍 할 수 있습니다 (다중화되지 않음).
나는 ffmpeg가 라이브 fmp4 스트림 (예 : 장기 실행 HTTP POST 사용)을 푸시 할 수 있어야한다고 생각하지만, 플레이 아웃에는 의미있는 작업을 수행하기 위해 원본 소프트웨어 가 필요합니다 (예 : HLS로 스트리밍).
'code' 카테고리의 다른 글
D3 및 Shiny를 사용하여 R에서`identify ()`구현 (0) | 2020.12.26 |
---|---|
특성에 대한 알림을 설정하면 잘못된 핸들 오류가 발생 함 (0) | 2020.12.26 |
최신 Blink 포함 브라우저 (예 : Chrome, Opera)에서 이상한 스크롤 동작 (0) | 2020.12.26 |
Motorola 장치 : ThreeTen에서 날짜 구문 분석시 org.threeten.bp.DateTimeException (0) | 2020.12.26 |
matplotlib 그림을 만든 후 어떻게 메모리를 해제 할 수 있습니까? (0) | 2020.12.26 |