2011-02-24 15 views
13

co chcęFFmpeg Jak napisać wideo do pliku

1. Get video packet from stream source 
2. Decode it 
3. And write that decoded data as video file(avi, mpeg etc) 

mogę w stanie uzyskać pakietów wideo z pliku (jako AVPacket), a także może dekodować i zapisać jako obraz. (Raw) (Samouczki FFmpeg pokazują, jak to zrobić). Ale nie mogę (nie wiem) napisać, że dane wideo do pliku (inne), które mogą być odtwarzane przez odtwarzacze multimedialne (takie jak VLC).

Najlepsze życzenia

Ps: Próbki prawdziwy kod będzie wielki, jeśli to możliwe ...

Teraz robię próbę z av_interleaved_write ale mam dziwny błąd „Znaczniki czasu non monotone” (mam żadnej kontroli ponad pts wartości źródła mediów)

kilka dodatkowych informacji

w FFmpeg muszę

  1. Odczytywanie pakietów multimedialnych ze źródła mediów (może to być prawdziwy plik (.avi, mov) lub nawet serwer rtsp).
  2. Następnie napisać te pakiety multimedialne do rzeczywistego pliku (fizycznej .avi, .mov etc)

muszę czytnika i pisarz. Mogę odczytać plik źródłowy mediów (nawet kodować pakiety zgodnie z podanym formatem). Ale nie mogę zapisać do pliku ... (który może grać każdy gracz)

A niektóre Pseudokod

File myFile("MyTestFile.avi"); 

while (source ->hasVideoPackets) 
{ 
    packet = source->GetNextVideoPacket(); 
    Frame decodedFrame = Decode(packet); 
    VideoPacket encodedPacket = Encode(decodedFrame); 
    myFile.WriteFile(encodedPacket); 
} 

lub po prostu zapisać plik oryginalny bez kodowania dekodowania

 File myFile("MyTestFile.avi"); 

    while (source ->hasVideoPackets) 
    { 
     packet = source->GetNextVideoPacket(); 
     myFile.WriteFile(packet); 
    } 

Następnie

I can able to open MyTest.avi file with a player. 
+0

Nagroda Bounty dla osoby, która podaje link do dobrego przykładu, który ją realizuje. za pomocą av_interleaved_write_frame lub av_write_frame –

+0

sprawdź ten link, który demonstruje zapis wideo pliku przy użyciu bibliotek FFMPEG: https://stackoverflow.com/a/43464269/6180077 –

Odpowiedz

0

Zrobiłem coś takiego w pewnym momencie używając libx264 i vorbis.

Przykładowy kod. https://github.com/Themaister/SSNES/blob/master/record/ffemu.c

Podstawową ideą jest to, że musisz ustawić sygnatury czasowe siebie w AVFrame, kiedy chcesz je zakodować. Następnie możesz wziąć ten pakiet i napisać go pod numerem av_interleaved_write().

+0

Ok. Sprawdzę. Dziękuję za odpowiedź. – NoviceAndNovice

+0

No cóż, nie mogę wymyślić, jak powiedzieć "av_interleaved_write_frame", piszemy pakiety, do których fizyczny plik (np. Czyta pakiety i piszemy do pliku "mytest.avi".) – NoviceAndNovice

+0

Cóż, ja się domyślam ctx-> oformat = av_guess_format (NULL, ctx-> filename, NULL), ale ponieważ mam jeden plik źródłowy i plik docelowy, powinienem utworzyć 2 AVFormatContext: jeden do odczytu i jeden do zapisu? – NoviceAndNovice

0

trzeba napisać koder przekształcić surowe dane do wymaganego formatu wideo

ffmpeg encoding sample wanted?

Encode audio to aac with libavcodec

+0

Potrafię kodować i dekodować dane przy użyciu biblioteki ffmpeg (nie cli , użyj api), czego nie mogę zrobić, to napisać do rzeczywistego pliku za pomocą funkcji av_interleaved_write, aby każdy gracz mógł go odtworzyć. (z pewnością odtwarzacz ma potrzebne kodeki). – NoviceAndNovice

4

Prawdopodobnie ten link może pomóc:

Output a media file in any supported libavformat format

Mam nadzieję, że to pomaga.

+0

W przykładzie użyto 'av_interleaved_write_frame'. – bacchus

+0

Powyższy przykład generuje fikcyjne wideo Plik, o który pyta to pytanie, to przykład dekodowania i kodowania wideo. Problem dotyczy rzeczywistego użycia avcodec_ecode_video i avcodec_decode_video jako niewłaściwe użycie skutkuje różnymi błędami segmentacji i niedopełnieniem bufora. Podałem już wszystkie podane przykłady domyślne. Wydaje mi się, że dobry przykład prawdopodobnie przerwałby to z ffmpeg.c –

+0

@AdityaGameProgrammer Nie możesz połączyć powyższego kodu linku z tym [jednym] (http://www.inb.uni-luebeck.de/~ boehme/using_libavcodec.html), aby mieć to, czego chcesz? Powyższe wyjaśnia, jak pisać klatki, ten w tym komentarzu do czytania i dekodowania. Jeśli połączysz oba, możesz uzyskać pożądany efekt. – bacchus