Как программно определить размеры видео в окнах - PullRequest
0 голосов
/ 09 апреля 2011

Я пытаюсь добавить функцию в программу, которую я пишу, чтобы определить ширину и высоту видеофайла (которую можно выбрать с помощью кнопки обзора ..). Я использую Python и Qt, и я просмотрел все и не могу найти никакой помощи по этому вопросу. Формат видео в настоящее время .flv, но будет расширен в будущем, чтобы включить другие форматы, такие как H.264.

Проводник Windows может сообщить мне размеры видео, если щелкнуть правой кнопкой мыши файл и выбрать свойства, затем выбрать вкладку «Сводка» и нажать «Дополнительно». Ширина и высота, отображаемые там, как раз то, что мне нужно.

Есть идеи?

Спасибо

Marlon

1 Ответ

2 голосов
/ 09 апреля 2011

Проводник Windows читает заголовок файла для этой информации.

вижу 3 варианта:

  • Вы можете разобрать заголовок вручную, ища информацию метаданных (о боже, пожалуйста, не надо)
  • Используйте инструмент cmd-line и проанализируйте его вывод (отметьте popen () , чтобы узнать, как это сделать)
  • Использование сторонней библиотеки для извлечения соответствующей информации из видеофайла

Я предполагаю, что вы хотите сделать то, что проще. Я думаю, что написать оболочку для инструмента cmd-line, такого как mediainfo , для отображения информации о видеофайлах и последующего анализа ее вывода для захвата свойств видео было бы проще. Если у вас уже есть ffmpeg , установленный в вашей системе, вы тоже можете это сделать.

Еще один способ сделать это - использовать сторонние библиотеки, такие как libavformat (который является частью ffmpeg), для чтения свойств видео. Для полной демонстрации взгляните на tutorial01.c :

  // Register all formats and codecs
  av_register_all();

  // Open video file
  if(av_open_input_file(&pFormatCtx, argv[1], NULL, 0, NULL)!=0)
    return -1; // Couldn't open file

  // Retrieve stream information
  if(av_find_stream_info(pFormatCtx)<0)
    return -1; // Couldn't find stream information

  // Find the first video stream
  videoStream=-1;
  for(i=0; i<pFormatCtx->nb_streams; i++)
    if(pFormatCtx->streams[i]->codec->codec_type==CODEC_TYPE_VIDEO) {
      videoStream=i;
      break;
    }
  if(videoStream==-1)
    return -1; // Didn't find a video stream

  // Get a pointer to the codec context for the video stream
  pCodecCtx=pFormatCtx->streams[videoStream]->codec;

  // The relevant structure here is: pCodecCtx
  // More precisely: pCodecCtx->width and pCodecCtx->height
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...