C++: use ffmpeg para leer el ángulo de rotación del video y use OpenCV para rotar el video según el ángulo de rotación.

1 Información de rotación en videos y por qué hay información de rotación

Al grabar videos en teléfonos móviles como Android o iOS, el video grabado tendrá información de rotación debido a la detección de gravedad o la ubicación del video grabado. Si graba en orientación horizontal (el teléfono se gira 90 grados en sentido antihorario), el vídeo grabado no tendrá ángulo. Si se graba en pantalla vertical (postura normal de sostener el teléfono), el ángulo de rotación del vídeo grabado en este momento es de 90 grados. Si lo gira otros 90 grados, el botón de volumen y el botón de apagado de pantalla generalmente están hacia abajo, y el ángulo de rotación del video en este momento es de 180 grados. Etcétera. Por lo tanto, los videos en teléfonos móviles generalmente tienen cuatro ángulos de video. Al reproducir, los recursos de video deben rotarse antes de reproducirse, de lo contrario, el video se invertirá y se volcará de varias maneras.

El código sobre cómo leer el ángulo de rotación del video y rotar el cuadro de video de acuerdo con el ángulo de rotación del video en Python se ha compartido en https://www.stubbornhuang.com/1855/. Aquellos que estén interesados ​​pueden consultarlo .

Podemos usar la herramienta ffprobe en ffmpge para ver la información de metadatos del video:

1.1 Información de metadatos de video sin información de rotación, es decir, el ángulo de rotación es 0

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'a.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: isommp42
    creation_time   : 2021-07-17T14:12:45.000000Z
    location        : +28.7793+113.2697/
    location-eng    : +28.7793+113.2697/
    com.android.version: 8.1.0
  Duration: 00:00:06.13, start: 0.000000, bitrate: 18162 kb/s
    Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuvj420p(pc, smpte170m), 1920x1080, 17008 kb/s, SAR 1:1 DAR 16:9, 29.86 fps, 30 tbr, 90k tbn, 180k tbc (default)
    Metadata:
      creation_time   : 2021-07-17T14:12:45.000000Z
      handler_name    : VideoHandle
    Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, mono, fltp, 96 kb/s (default)
    Metadata:
      creation_time   : 2021-07-17T14:12:45.000000Z
      handler_name    : SoundHandle

1.2 Información de metadatos de vídeo girada 90 grados

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'b.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: isommp42
    creation_time   : 2021-08-20T05:32:36.000000Z
    location        : +00.0000+000.0000/
    location-eng    : +00.0000+000.0000/
    com.android.version: 10
  Duration: 00:00:03.89, start: 0.000000, bitrate: 8777 kb/s
    Stream #0:0(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 127 kb/s (default)
    Metadata:
      creation_time   : 2021-08-20T05:32:36.000000Z
      handler_name    : SoundHandle
    Stream #0:1(eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, unknown/bt470bg/unknown), 720x1280, 8724 kb/s, SAR 1:1 DAR 9:16, 30.09 fps, 30 tbr, 90k tbn, 180k tbc (default)
    Metadata:
      rotate          : 90
      creation_time   : 2021-08-20T05:32:36.000000Z
      handler_name    : VideoHandle
    Side data:
      displaymatrix: rotation of -90.00 degrees

1.3 Información de metadatos de vídeo girada 180 grados

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'c.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: isommp42
    creation_time   : 2021-07-18T01:43:43.000000Z
    com.android.version: 10
  Duration: 00:00:04.98, start: 0.000000, bitrate: 4997 kb/s
    Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709), 1920x1080, 3502 kb/s, SAR 1:1 DAR 16:9, 29.12 fps, 29.50 tbr, 90k tbn, 180k tbc (default)
    Metadata:
      rotate          : 180
      creation_time   : 2021-07-18T01:43:43.000000Z
      handler_name    : VideoHandle
    Side data:
      displaymatrix: rotation of -180.00 degrees
    Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 193 kb/s (default)
    Metadata:
      creation_time   : 2021-07-18T01:43:43.000000Z
      handler_name    : SoundHandle

1.4 Información de metadatos de vídeo girada 270 grados

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'd.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: isommp42
    creation_time   : 2021-10-29T01:52:22.000000Z
    location        : +28.2386+113.0239/
    location-eng    : +28.2386+113.0239/
    com.android.version: 11
  Duration: 00:00:06.15, start: 0.000000, bitrate: 19144 kb/s
    Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709), 1080x1920, 18490 kb/s, SAR 1:1 DAR 9:16, 30.08 fps, 90k tbr, 90k tbn, 180k tbc (default)
    Metadata:
      rotate          : 270
      creation_time   : 2021-10-29T01:52:22.000000Z
      handler_name    : VideoHandle
    Side data:
      displaymatrix: rotation of 90.00 degrees
    Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s (default)
    Metadata:
      creation_time   : 2021-10-29T01:52:22.000000Z
      handler_name    : SoundHandle

A partir de la información de metadatos de varios videos anteriores, podemos ver que si el video tiene información de rotación, el ángulo de rotación se almacenará en el campo de rotación de la información de metadatos de la transmisión de video, por ejemplo:

    Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709), 1080x1920, 18490 kb/s, SAR 1:1 DAR 9:16, 30.08 fps, 90k tbr, 90k tbn, 180k tbc (default)
    Metadata:
      rotate          : 270
      creation_time   : 2021-10-29T01:52:22.000000Z
      handler_name    : VideoHandle

2 Utilice ffmpeg C++ SDK para obtener la información de rotación de la transmisión de video de un video

El ángulo de rotación del video que vi antes estaba usando la herramienta ffprobe, pero ¿cómo usar ffmpeg SDK en el código para obtener la información del ángulo del video?

A través del descubrimiento anterior, el ángulo de rotación del video se almacena en los metadatos de la transmisión de video, por lo que primero podemos abrir el archivo de video, luego encontrar la transmisión de video en el video y finalmente obtener la información de metadatos de la transmisión de video y Obtenga el ángulo de rotación. El código específico es el siguiente:

double GetVideoRotationMetadataInfo(const std::string& video_path)
{
   
    
    
	double rotationResult = 0.0;

	AVFormatContext* format_ctx = NULL;
	AVDictionaryEntry* tag = NULL;

	int ret;

	if ((ret = avformat_open_input(&format_ctx, video_path.c_str(), NULL, NULL)))
		return ret;

	// 查找文件视频流信息
	int video_stream_idx = -1;
	for (int i = 0; i < format_ctx->nb_streams; ++i)
	{
   
    
    
		if (format_ctx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)
		{
   
    
    
			video_stream_idx = i

Supongo que te gusta

Origin blog.csdn.net/HW140701/article/details/121763374
Recomendado
Clasificación