Próbuję kodować surowe H264 do kontenera mp4 przy użyciu FFMPEG API w C++. To wszystko działa dobrze, jednak pole AVCC jest pusta, i zwraca błąd: [plik iso] Box „AVCC” rozmiar 8 nieprawidłowejC++ FFMPEG nie zapisywanie informacji o polu AVCC
Gdybym wtedy użyć narzędzia wiersza poleceń w pliku wyjściowym: ffmpeg - i output.mp4 -vcodec copy fixed.mp4
Plik wyjściowy działa, a AVCC jest wypełniony wymaganymi informacjami. Nie rozumiem, dlaczego ten argument wiersza polecenia działa, ale nie mogę wygenerować tego samego wyniku za pomocą interfejsu API.
Co zrobić w C++ kod (również robić rzeczy między wywołań funkcji):
outputFormat_ = av_guess_format("mp4", NULL, NULL); //AV_CODEC_H264
formatContext_ = avformat_alloc_context();
formatContext_->oformat = outputFormat_;
...
AVDictionary *opts = NULL;
char tmpstr[50]; sprintf(tmpstr, "%i", muxRate * KILOBYTESTOBYTES);
av_dict_set(&opts, "muxrate", tmpstr, 0);
avformat_write_header(formatContext_, &opts);
av_write_trailer(formatContext_);
Wyjście to jest prawidłowe, z wyjątkiem to brakuje AVCC informacji. Dodanie tego jest ręczne (i odpowiednie ustawienie długości skrzynek) pozwala mi odtworzyć wideo w porządku. Każdy pomysł, dlaczego wywołania API nie generują informacji AVCC?
Tutaj znajdują się znaki z mp4 przed naprawą: .avc1 ......................... .8.H ... H .......................................... ÿÿ ... .avcC .... stts
i po: avc1 ......................... .8.H ... H .......................................... ÿÿ ...! avcC.B € (ÿá..gB € (Ú.à.- • ... hÎ < € ... stts
Mam do czynienia z tym samym problemem, gdy przechwytuję ramkę z kamery i koduję do h264 wewnątrz kontenera mp4. Czy masz pojęcie, w jaki sposób mogę ustawić "extradata"? – alijandro
Czy dane wyjściowe kamery h264? Jeśli tak, poszukaj bloków PPS i SPS (0x00 0x00 0x00 0x01 0x67 i 0x00 0x00 0x00 0x01 0x68). – awr
Dziękuję za odpowiedź. Jest to problem powodowany przez nową API ffmpeg, kopiowanie danych z AVCodecContext do AVStream-> codecpar-> extradata naprawia ten problem. – alijandro