Jak napisać wideo przy użyciu kompresji H.264 z klasą VideoWriter w OpenCV? Zasadniczo chcę uzyskać wideo z kamery internetowej i zapisać je po naciśnięciu znaku. Plik wideo ouput jest ogromny, gdy używana jest kompresja MPEG4 Part 2.Zapisywanie pliku wideo przy użyciu kompresji H.264 w OpenCV
Odpowiedz
Z pewnością można używać klasy VideoWriter
, ale trzeba użyć the correct FourCC code, która reprezentuje standard H264. FourCC oznacza Four Character Code, który jest identyfikatorem kodeka wideo, formatu kompresji, koloru lub formatu pikseli używanych w plikach multimedialnych.
W szczególności, podczas tworzenia obiektu VideoWriter
, podczas tworzenia go należy podać kod FourCC. Skonsultować docs OpenCV więcej szczegółów: http://docs.opencv.org/trunk/modules/highgui/doc/reading_and_writing_images_and_video.html#videowriter-videowriter
jestem przy założeniu, że używasz C++, a więc definicja konstruktora VideoWriter
jest:
VideoWriter::VideoWriter(const String& filename, int fourcc,
double fps, Size frameSize, bool isColor=true)
filename
jest wyjście z pliku wideo, fourcc
to kod FourCC dla kodu, którego chcesz użyć, fps
to żądana liczba klatek na sekundę, frameSize
to żądane wymiary wideo, a isColor
określa, czy chcesz, aby wideo było kolorowe. Mimo że FourCC używa czterech znaków, OpenCV ma narzędzie, które analizuje FourCC i wypisuje pojedynczy identyfikator integer, który jest używany jako odnośnik, aby móc zapisać poprawny format wideo do pliku. Korzystasz z funkcji CV_FOURCC
i określasz cztery pojedyncze znaki - każdy odpowiadający pojedynczemu znakowi w kodzie FourCC żądanego kodeka.
Konkretnie, można nazwać to tak:
int fourcc = CV_FOURCC('X', 'X', 'X', 'X');
Wymień X
z każdego znaku, który należy do FourCC (w tej kolejności). Ponieważ chcesz standard H264, by utworzyć VideoWriter
obiekt tak:
#include <iostream> // for standard I/O
#include <string> // for strings
#include <opencv2/core/core.hpp> // Basic OpenCV structures (cv::Mat)
#include <opencv2/highgui/highgui.hpp> // Video write
using namespace std;
using namespace cv;
int main()
{
VideoWriter outputVideo; // For writing the video
int width = ...; // Declare width here
int height = ...; // Declare height here
Size S = Size(width, height); // Declare Size structure
// Open up the video for writing
const string filename = ...; // Declare name of file here
// Declare FourCC code
int fourcc = CV_FOURCC('H','2','6','4');
// Declare FPS here
int fps = ...;
outputVideo.open(filename, fourcc, fps, S);
// Put your processing code here
// ...
// Logic to write frames here... see below for more details
// ...
return 0;
}
Alternatywnie, można po prostu to zrobić podczas deklarowania Twojego VideoWriter
obiektu:
VideoWriter outputVideo(filename, fourcc, fps, S);
Jeśli używasz powyżej, to nie jest wymagane, aby zadzwonić pod numer open
, ponieważ spowoduje to automatyczne otwarcie programu zapisującego do zapisywania klatek do pliku.
Jeśli nie jesteś pewien, czy H.264 jest obsługiwany na komputerze, należy określić -1
jak kod fourcc, a okno powinno pojawić się podczas uruchamiania kodu, który wyświetla wszystkie dostępne kodeki wideo, które są na twoim komputerze. Chciałbym wspomnieć, że działa to tylko w systemie Windows. System Linux lub Mac OS nie wyświetla tego okna po określeniu -1
. Innymi słowy:
VideoWriter outputVideo(filename, -1, fps, S);
Możesz wybrać, który z nich jest najbardziej odpowiedni, jeśli H.264 nie istnieje na twoim komputerze. Gdy to zrobisz, OpenCV utworzy odpowiedni kod FourCC, który zostanie wprowadzony do konstruktora VideoWriter
, dzięki czemu otrzymasz instancję VideoWriter reprezentującą VideoWriter
, która zapisze ten typ wideo do pliku.
Gdy masz ramkę gotową, przechowywana w frm
do zapisu do pliku, można to zrobić albo:
LUB
outputVideo.write(frm);
Jako bonus, oto poradnik jak czytać/pisać wideo w OpenCV: http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_gui/py_video_display/py_video_display.html - Jednak jest napisany dla Pythona, ale dobrze wiedzieć, że znajduje się u dołu łącza, jest lista kodów FourCC, które są znane k dla każdego systemu operacyjnego. BTW, kod FourCC, który określają dla standardu H264, w rzeczywistości jest 'X','2','6','4'
, więc jeśli 'H','2','6','4'
nie działa, zastąp H
przez X
.
Kolejna mała uwaga. Jeśli korzystasz z systemu Mac OS, musisz użyć opcji 'A','V','C','1'
lub 'M','P','4','V'
. Z doświadczenia, 'H','2','6','4'
lub 'X','2','6','4'
przy próbie określenia kodu FourCC wydaje się nie działać.
- 1. Strumień wideo H.264 przez rtp przy użyciu gstreamer
- 2. Zapisywanie pliku wideo do pliku OpenCV
- 3. Kodowanie wideo H.264 CBR z FFmpeg
- 4. wyjaśniłem kodek H.264
- 5. H.264 wideoenkoder w javascript
- 6. H.264 Muxed do MP4 przy użyciu libavformat nie odtwarza
- 7. Odtwarzanie strumieniowego wideo w jakości H.264 na iOS przy użyciu AVFoundation
- 8. Zapisywanie wideo openCV w pythonie
- 9. H.264 Strumieniowanie w czasie rzeczywistym
- 10. iPad nie renderuje wideo H.264 z HTML5
- 11. MPEG-ES H.264 Wideo z RTP na MPEG-TS
- 12. Zapisywanie pliku przy użyciu Greasemonkey
- 13. błędy przy dekodowaniu klatek H.264 za pomocą ffmpeg
- 14. Jak mogę przeprowadzić kodowanie i dekodowanie przy użyciu sprzętowego kodowania H.264 w celu przesyłania strumieniowego?
- 15. H.264 przez RTP/RTSP (iPhone)
- 16. Strumieniowanie na żywo h.264 przy użyciu HTML5 w przeglądarce Internet Explorer 9
- 17. Najszybszy sposób kompresji rozmiaru wideo przy użyciu biblioteki lub Algo
- 18. Kodowanie H.264 NAL/podział plasterka
- 19. RTSP h.264 w przeglądarce Google Chrome
- 20. Rozpoznawanie twarzy w wideo przy użyciu OpenCV daje nieobsługiwany wyjątek
- 21. Zapisywanie pliku Matlab przy użyciu Pythona
- 22. Zmiana rozdzielczości pliku wideo OpenCV
- 23. H.264 nad RTP - Określenie SPS i PPS ramek
- 24. Zapisywanie obrazu w OpenCV
- 25. Jak wyświetla się AVSampleBufferDisplayLayer H.264
- 26. Android H.264 Obsługa poziomu BaseProfile
- 27. zapisywanie wideo; przy użyciu UIImagePickerController; IOS 8 Swift
- 28. iPhone - Oddzielanie dźwięku z pliku wideo i zapisywanie go w oddzielnym pliku
- 29. Jak przetwarzać obrazy wideo, klatka po klatce w streamingu wideo przy użyciu pytka Opencv
- 30. Jak używać klasy MediaCodec do dekodowania strumieni H.264
Próbowałem programu. Najpierw, gdy próbowałem użyć parametru Fourcc jako -1, nie pojawiło się żadne okno. Kiedy próbowałem używać x264, jak wspomniałeś, pojawił się błąd "nie można otworzyć błędu kodera: libx264" i kilka innych błędów, takich jak "wykryto złamane domyślne ustawienia ffmpeg". Co powinienem zrobić BTW Używam ubuntu 14.04 –
To znaczy, że nie masz biblioteki H264 .... To jest kolejny post razem. Kiedy dostanę się do pracy, dam ci link. Przy tym -1 działa tylko w systemie Windows. Zapomniałem o tym wspomnieć. Ups! – rayryeng
Dziękuję .. daj mi znać, kiedy pracujesz nad instalacją lib h264. . Muszę wiedzieć, że deperately: –