Включая знание формата видео (формат кодека и инкапсуляции); как получить информацию о видео и формат видеокодека; чтение и сохранение видео opencv и формат кодирования opencv fourcc.
1. Базовые знания
Формат видеокодека и формат инкапсуляции
См. подробное объяснение кодирования и инкапсуляции видео.
Справочник Mystery Programmer формат кодирования видео opencv
Обратитесь к формату кодека видео Алекса Чанга bzdww
Обычные файлы AVI, RMVB, MKV, ASF, WMV, MP4, 3GP, FLV и другие файлы (с суффиксом .) можно рассматривать только как один типПакет стандартный. Полный видеофайл создаетсяАудио и видеоОн состоит из двух частей, таких как H264, Xvid и т. д. — форматы кодирования видео, MP3, AAC и т. д. — аудио.Формат кодирования.
Часто используемый режим затвора кодирования видео
Xvid(MPEG4), H264, MPEG1, MPEG2(Если вам интересно, вы можете узнатьИстория DivX и XviD, вот эти два брата, первый заряжает, второй опенсорс, последний в самый раз)
Общий формат пакета хранения
Вообще говоря, AVI и RM являются наиболее распространенными форматами в настоящее время, а AVI не подходит для передачи по сети из-за врожденных дефектов, m2ts и mkv являются передовыми стандартами нового поколения, которые постепенно могут стать популярными в будущем. WMV и ASF обычно являются форматами хранения алгоритма Microsoft MPEG4, DAT и MPG — методы хранения файлов, закодированных алгоритмом MPEG1, DAT в основном используется для VCD, а VOB — метод хранения файлов, закодированных алгоритмом MPEG2, на DVD.
Python использует ffmpeg для получения информации о видеофайле
! ! ! Обратите внимание на использование следующей команды для установки пакета, иначе будет сообщено об ошибке! ! !
pip install ffmpeg-python
Код ссылки
import ffmpeg
input_video = './data/rafting.avi'
if __name__ == "__main__":
probe = ffmpeg.probe(input_video)
video_stream_info = probe["streams"][0]
audio_stream_info = probe["streams"][1]
format_info = probe["format"]
# show video codec info
print("codec_type: {0} | codec_name: {1}| codec_long_name: {2}".format(video_stream_info["codec_type"],
video_stream_info["codec_name"],
video_stream_info["codec_long_name"]))
# show audo codec info
print("codec_type: {0} | codec_name: {1}| codec_long_name: {2}".format(audio_stream_info["codec_type"],
audio_stream_info["codec_name"],
audio_stream_info["codec_long_name"]))
# show container(encapsulation) format
print("filename:{0} | format_name: {1} | format_long_name: {2}".format(format_info["filename"],
format_info["format_name"],
format_info["format_long_name"]))
Образец вывода справочной видеоинформации
{'streams': [{'index': 0, 'codec_name': 'msmpeg4v2', 'codec_long_name': 'MPEG-4 part 2 Microsoft variant version 2', 'codec_type': 'video', 'codec_time_base': '1/12', 'codec_tag_string': 'MP42', 'codec_tag': '0x3234504d', 'width': 1920, 'height': 1080, 'coded_width': 1920, 'coded_height': 1080, 'closed_captions': 0, 'has_b_frames': 0, 'pix_fmt': 'yuv420p', 'level': -99, 'refs': 1, 'r_frame_rate': '12/1', 'avg_frame_rate': '12/1', 'time_base': '1/12', 'start_pts': 0, 'start_time': '0.000000', 'duration_ts': 19999, 'duration': '1666.583333', 'bit_rate': '2422022', 'nb_frames': '19999', 'disposition': {'default': 0, 'dub': 0, 'original': 0, 'comment': 0, 'lyrics': 0, 'karaoke': 0, 'forced': 0, 'hearing_impaired': 0, 'visual_impaired': 0, 'clean_effects': 0, 'attached_pic': 0, 'timed_thumbnails': 0}}], 'format': { ...}
Во-вторых, операции, связанные с видео opencv
1. Видеоинформация, связанная с чтением
Сначала прочитайте видеофайл, функциональная часть используется следующим образом
video_reader = cv2.VideoCapture('test.mp4')
cv2.VideoCapture()
Если переданный параметр является числом, это означает использование камеры. Например, cv2.VideoCapture(0) означает использование первой камеры компьютера.
Если передается адрес видео, это означает чтение локального видео. Здесь я использую только второй, задавая абсолютный путь к видео и читая его. Существуют также следующие две часто используемые функции:
- cv2.VideoCapture().isOpened() Проверяет нормальное ли состояние чтения видео
- cv2.VideoCapture().read() Получает определенный кадр видео и возвращает два значения, первое — логическое значение, указывающее, правильно ли получен «этот кадр», второе значение — содержимое этого кадра, которое матрица.
Получить основную информацию о видео
Например, чтобы получить информацию о кодеке FOURCC видео,Например, вывод 1145656920.
print( int(video_reader.get(cv2.CAP_PROP_FOURCC)))
## 或者直接整数参数替代,参考下面表格
print(int(video_reader.get(6)))
**Параметры cv2.VideoCapture.get**Обратитесь на официальный сайт
FOURCC
FourCC is a 4-byte code used to specify the video codec. The list of available codes can be found in fourcc.org. It is platform dependent. Following codecs work fine: In Fedora:
DIVX
,XVID
,MJPG
,X264
,WMV1
,WMV2
. (XVID
is more preferable.MJPG
results in high size video.X264
gives very small size video ) In Windows:DIVX
( more to be tested and added )FourCC code is passed as
cv2.VideoWriter_fourcc('M','J','P','G')
orcv2.VideoWriter_fourcc(\*'MJPG)
forMJPG
.
Вот специальная запись для FOURCC, вы можете увидеть, например, вывод 1145656920 выше,Opencv по умолчанию преобразует FOURCC из символа в int,Соответствующий принцип преобразования можно найти в викиТехнические подробности в .
Преобразуйте int в четырехзначный символ, обратитесь к следующему коду Python
def decode_fourcc(cc):
return "".join([chr((int(cc) >> 8 * i) & 0xFF) for i in range(4)])
decode_fourcc(1145656920)
'XVID'
или обратитесь к этомуС++ код
unsigned int f = (unsigned)capture.get(cv::CAP_PROP_FOURCC);
char fourcc[] = {
(char)f, // First character is lowest bits
(char)(f >> 8), // Next character is bits 8-15
(char)(f >> 16), // Next character is bits 16-23
(char)(f >> 24), // Last character is bits 24-31
'\0' // and don't forget to terminate
};
cout << "the return int fourcc was: " << f << endl;
cout << "FourCC for this video was: " << fourcc << endl;
/*运行结果为:
the return int fourcc was: 1145656920
FourCC for this video was: XVID
*/
Или это онлайн-конверсия,Online in fourCC для символов; Кроме того, в opencv есть функция автоматического преобразования fourCC из четырех символов в int
cv2.VideoWriter_fourcc(*'XVID') ### 1145656920
Некоторые общие символы FourCC и таблица сравнения целых чисел
персонаж | соответствующий целому числу |
---|---|
"XVID" | 1145656920 |
"MJPG" | 1196444237 |
"X264" | 875967064 |
"DIB" | 541215044 |
"WMV1" | 827739479 |
"WMV2" | 844516695 |
3. Читайте связанные видео
Эта часть относительно проста, есть много онлайн-уроков, просто вставьте код
success = True
video_reader = cv2.VideoCapture(video_path)
while success and video_reader.isOpened():
# get a frame
success, frame = video_reader.read()
# show a frame
cv2.imshow("capture", frame)
if cv2.waitKey(100) & 0xFF == ord('q'):
break
video_reader.release()
cv2.destroyAllWindows()
3. Сохраните связанные с видео
cv2.VideoWriter()
Чтобы сохранить видео, вам нужно использовать функцию cv2.VideoWriter().
VideoWriter(filename, fourcc, fps, frameSize[, isColor]) -> <VideoWriter object>
Описание параметра:
Три более важных формата кодирования FOVECC, обращают внимание на формат и соответствующее совпадение суффикса; Video Video Suffix, убедитесь, что письменное изображение согласуется с этим разрешением, если вы хотите изменить разрешение, вы должны сначала изменить размер изображения А затем сохраните его к определенному разрешению; iscolor, true, входное изображение должно быть RGB, в противном случае его нельзя сохранить, но не будет сообщать об ошибке, но обнаружено, что сохраненное видео пустое и не может быть открыто.
- имя файла, путь к видео для сохранения
- Fourcc, кодек кодирования кадра сжатия видео, например, cv2.VideoWriter_fourcc('M', 'P', '4', '2') или cv2.VideoWriter_fourcc(*"MP42") означает использование кодека MPEG-4.2 , вы можете обратиться к этому:Полный список Fourcc, которые можно использовать
- fps, частота кадров выходного видео
- frameSize, размер каждого кадра выходного видео,Он должен быть таким же, как размер записываемой рамки, иначе будут проблемы
- цвет,Если он не равен нулю, кодировщик будет ожидать кодирования цветных кадров; в противном случае — кадров в градациях серого (этот флаг поддерживается только в Windows).
Добавить примечание о FourCC
Четыре символа используются для представления кодека сжатого кадра, например: CV_FOURCC('P','I','M','1') = кодек MPEG-1 CV_FOURCC('M','J','P','G') = кодек движения-jpeg CV_FOURCC('M', 'P', '4', '2') = кодек MPEG-4.2 CV_FOURCC('D', 'I', 'V', '3') = кодек MPEG-4.3 CV_FOURCC('D', 'I', 'V', 'X') = кодек MPEG-4 CV_FOURCC('U', '2', '6', '3') = кодек H263 CV_FOURCC('I', '2', '6', '3') = кодек H263I CV_FOURCC('F', 'L', 'V', '1') = кодек FLV1 ПРИМЕЧАНИЕ. Метод кодирования, при котором создается наименьший размер файла, — это кодек MPEG-4.2. Параметр конструктора класса VideoWriter — CV_FOURCC('M', 'P', '4', '2'). Самым большим является кодек MPEG-1, и соответствующий параметр конструктора класса VideoWriter — CV_FOURCC('P','I','M','1'), который занимает в 5,7 раза больше места на диске. Поэтому, если вам необходимо осуществлять запись и мониторинг 24 часа в сутки, вы можете отдать приоритет использованию метода кодека MPEG-4.2. Если код кодировщика равен -1, во время выполнения появится окно выбора кодировщика.
Оригинальная ссылка:blog.CSDN.net/Ищу 931110/Ах…
пример
Сначала определите выходной файл
fps_cv = video_reader.get(cv2.CAP_PROP_FPS) ### 视频fps, opencv检测到的
fourcc = cv2.VideoWriter_fourcc(*'XVID') ### 保存视频的格式
h, w, c = frame.shape
out = cv2.VideoWriter(save_path, fourcc, fps_cv, (w, h), isColor=True) ## 保存视频
Затем читайте видео снова и снова и сохраняйте каждый кадр как новое видео.
success = True
video_reader = cv2.VideoCapture(video_path)
while success and video_reader.isOpened():
# get a frame
success, frame = video_reader.read()
### save frame
out.write(frame)
out.release() ### 完成保存,释放
video_reader.release()
Протестированы различные форматы видео
Сохранение видео 1080p, всего 300 кадров контента, H.265 и H.264 еще не тестировались, opencv нужны соответствующие зависимости
разрешение | Формат | нужно время | Размер файла |
---|---|---|---|
1920*1080 | 'XVID' MPEG-4 codec | 1.7377230167388915 | 6.2MB |
1920*1080 | Кодек MP42 MPEG-4.2 | 1.7837894439697266 | 6.1MB |
1920*1080 | "DIVX" MPEG-4 codec | 1.7331401348114013 | 6.2MB |
1920*1080 | "DIV3" MPEG-4.3 codec | 3.3492454290390015 | 6.1MB |