2016-04-13 55 views
10

Nagrywam wideo z FFmpeg i chciałbym, aby liczba klatek na sekundę, w której została zapisana, była co najmniej w odpowiednim parku. Teraz biorę liczbę klatek na sekundę, którą moje wejście twierdzi, i używam jej do ustawienia szybkości klatek (time_base) dla mojego wyjściowego strumienia wideo. Czasami jednak różni się to od rzeczywistej liczby klatek na sekundę, jaką otrzymuję (widziałem strumień, który żąda 50 fps, ale publikuje przy 9 fps).Nagrywanie wideo o nieznanej liczbie klatek na sekundę za pomocą FFmpeg

Chciałbym użyć upływającego timera i policzyć klatki, które nagrywam, aby obliczyć rzeczywistą liczbę klatek na sekundę zarejestrowaną w momencie zakończenia nagrywania. Wydaje mi się jednak, że szybkość odtwarzania jest ustawiona w moim AVStream jest używany w avcodec_open2 przed napisaniem jakichkolwiek ramek. Jeśli ustawię to później (na przykład podczas pisania ramek), podczas gdy ffplay może je odtwarzać (narzekając, że bity przyrostowe wynoszą 6, a nie 4), inne odtwarzacze wideo nie mogą tego zrobić. Czy istnieje sposób ustawiania liczby klatek na sekundę dla całego pliku po napisaniu klatek na? Jeśli nie, to czy istnieje sposób na określenie ramek jako pewnego rodzaju znacznika czasu lub liczby klatek na sekundę, podczas gdy ja nagrywam, co spowoduje powstanie ważnego nagranego pliku?

+0

Witam, będę wyglądać bardziej, ale po prostu chciałem zapytać o avconv. znalazł go po szybkim wyszukiwaniu w Google, wygląda na to, że może zmienić szybkość klatek pliku. może mógłbyś napisać plik z dowolną liczbą klatek na sekundę, a następnie po wykryciu realnej stawki, zakończyć pisanie i uruchomić avconv z nową stawką? tylko myśl, a nie prawdziwa odpowiedź;) nadal będzie wyglądać. daj mi znać. – nephi12

+0

avconv to nazwa binarna projektu libav. (http://superuser.com/questions/507386/why-would-i-choose-libav-over-ffmpeg- or-is-there-even-a-difference) ma całkiem przyzwoite podsumowanie wszystkich nazw, które jestem zdezorientowany od dłuższego czasu. Cokolwiek avconv powinno być możliwe z bibliotekami, których używa. – Chris

Odpowiedz

0

Sztuką wydaje się być użycie AVCodecContext time_base i AVFrame pts w bardziej inteligentny sposób niż ja. Jeśli nagrywasz ze stałą szybkością klatek, wtedy time_base jest ustawione na 1/frazę, a pts to po prostu zwiększona liczba dla nagranej klatki.

Zamiast tego, teraz rozpoczynam upływ czasu, kiedy rozpoczynam nagrywanie i ustawię time_base na 1 na ziarnistości timera (w moim przypadku ma on dokładność milisekundową, czyli 1000). Ustawiłem pts ramki na czas, który upłynął, zanim zostanie zakodowany. Ta kombinacja daje plik wideo ze zmienną szybkością klatek, która odtwarza się poprawnie.

0

Chris. Musisz opracować nowy mechanizm zapisu strumienia wideo. Jeśli więc ustawisz szybkość klatek na [N], ramka zapisu będzie zapisywać klatki według stawki.

  • Sprawdzanie znacznik czasu dla każdej ramki podczas pisania
  • Jeśli masz mniej niż N klatek na sekundę, trzeba dokonać zduplikowanych ramek.
  • Jeśli masz więcej klatek niż N na sekundę, musisz upuścić klatki.

Przed napisaniem należy podać dokładną liczbę klatek na sekundę.

A twój silnik zapisu pliku wideo musi działać z określoną szybkością klatek.

Możesz to zaimplementować za pomocą narzędzia ffmpeg.

+0

To wydaje się najlepsze, co można zrobić ze zmienną szybkością klatek, ale co, gdyby było naprawione i nieznane? W przypadku, w którym przedstawiłem strumień, otrzymuje on 50 klatek na sekundę, ale faktycznie wynosi 9, więc podczas gdy twoje podejście byłoby skuteczne, nagrywałbym ponad 5 razy więcej klatek, niż bym musiał. Zasadniczo to, aby działało dobrze, nadal wymaga, abyś znał liczbę klatek na sekundę przed rozpoczęciem. – Chris