我发现了一个Stack Overflow帖子,其中有一个示例显示了如何获取AVI文件的持续时间:
我在我的Delphi 6应用程序中为我的目的修改了它并创建了下面的代码.最初我在调用AviFileExit()之前删除了核对IAviFile指针的行.但是当我这样做时,我在调用AviFileExit()时遇到了访问冲突.我恢复了线路,访问违规消失了.
为什么在调用AviFileExit()之前需要核对IAviFile引用?这是内存泄漏吗?我认为正常的接口引用计数在这里可以正常工作,但显然它没有.有没有其他方法来消除错误,如调用AviStreamRelease()等?
这是我的代码:
function getAviDurationSecs(theAviFilename: string): Extended;
var
aviFileInfo : TAVIFILEINFOW;
intfAviFile : IAVIFILE;
framesPerSecond : Extended;
begin
intfAviFile := nil;
AVIFileInit;
try
// Open the AVI file.
if AVIFileOpen(intfAviFile, PChar(theAviFilename), OF_READ, nil) <> AVIERR_OK then
raise Exception.Create('(getAviDurationSecs) Error opening the AVI file: ' + theAviFilename);
try
// Get the AVI file information.
if AVIFileInfoW(intfAviFile, aviFileInfo, sizeof(aviFileInfo)) <> AVIERR_OK then
raise Exception.Create('(getAviDurationSecs) Unable to get file information record from the AVI file: ' + theAviFilename);
// …
Run Code Online (Sandbox Code Playgroud) 我刚刚在R. Laganiere的"OpenCV 2计算机视觉应用程序设计手册"一书中读过这篇文章:
请务必注意,为了打开指定的视频文件,您的计算机必须安装相应的编解码器,否则cv :: VideoCapture将无法理解输入文件.通常情况下,如果您能够在计算机上使用视频播放器打开视频文件(例如Windows Media Player),那么OpenCV也应该能够读取此文件.
不幸的是,事情对我来说并不容易.是的,我可以在我的视频播放器上读取avi文件,但它不适用于我的OpenCV-Qt应用程序.VideoCapture isOpen()方法返回false,尽管路径是正确的,并且所需的每个编解码器似乎都在这里.我尝试了几个文件,因此它与一种特定格式无关.
这里有人有使用OpenCV在Ubuntu中打开avi文件的经验吗?我认为这是一个大问题,在互联网上找不到任何相关的解决方案......
谢谢 !!
[编辑]这是我正在努力的功能; 这里的一些变量是类成员,因此可能看起来不完整.但是,正是这段代码无法正常工作.特别是,我实例化一个新的VideoCapture对象的行.
void MainWindow::on_actionOuvrir_fichier_triggered()
{
//mettre a -1 streamId
streamId = -1;
//get path to the avi file
QString fileName = QFileDialog::getOpenFileName(this,tr("Ouvrir fichier video"),"/home", tr("Videos (*.avi)"));
std::string utf8_text = fileName.toUtf8().constData();
//open .avi
capture = new VideoCapture(utf8_text);
//check
if(!capture->isOpened())
cout << "probleme ouverture fichier video" << endl;
//delay between each frame in ms
rate = capture->get(CV_CAP_PROP_FPS);
delay = 1000 / rate;
//start Qtimer recordId
recordId = startTimer(delay);
//capture …
Run Code Online (Sandbox Code Playgroud) 我需要一些帮助将视频从笔记本电脑摄像头保存到文件。现在我使用代码在 pictureBox 上搜索视频设备和以前的视频。我尝试过 AVIFileWrite 但失败了。如何使用VideoFileWriter来实现我的目标?
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using AForge.Video;
using AForge.Video.DirectShow;
using AForge.Video.FFMPEG;
using System.IO;
using AForge.Video.VFW;
using System.Drawing.Imaging;
namespace VideoCapture
{
public partial class Form1 : Form
{
private FilterInfoCollection VideoCaptureDevices;
private VideoCaptureDevice FinalVideo;
public static Bitmap _latestFrame;
//private VideoFileWriter writer;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
VideoCaptureDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
foreach (FilterInfo VideoCaptureDevice in VideoCaptureDevices)
{
comboBox1.Items.Add(VideoCaptureDevice.Name);
}
comboBox1.SelectedIndex = …
Run Code Online (Sandbox Code Playgroud) 我正在使用openCV GPU处理120 fps的视频文件.我的问题是:我可以以相同的帧速率显示处理过的图像吗?当我使用imshow显示图像时,fps降低到20~30.我可以更快地显示这些图像(最高120 fps)吗?
谢谢
我有一堆 DV avi 视频,我想将它们剪辑在一起。我设法保存了创建日期,因此视频以其创建日期命名。所以我把它们剪在一起后,我仍然有最初的创作日期。但后来我想把那个日期放回到元数据中,它在被剪切在一起并从 DV avi 转换为 mp4 后被修改。
我正在尝试使用 exiftool,但我是个菜鸟,无法正确使用它。最后一个问题是。是否有可能从文件名中批量更改“创建日期”元数据?
文件名如下所示:YYYY-MM-DD-HH-MM-SS.mp4 我想把它放到创建元标记的日期中。
我正在使用多光谱相机来收集数据.一个是近红外线,另一个是彩色的.不是两个摄像头,而是一个摄像头可以同时获得两种不同的图像.我可以使用一些API函数,如J_Image_OpenStream.核心代码的两部分如下所示.一个用于打开两个流(实际上它们在一个样本中,我必须使用它们,但我的意思并不太清楚)并设置两个avi文件的保存路径并开始采集.
// Open stream
retval0 = J_Image_OpenStream(m_hCam[0], 0, reinterpret_cast<J_IMG_CALLBACK_OBJECT>(this), reinterpret_cast<J_IMG_CALLBACK_FUNCTION>(&COpenCVSample1Dlg::StreamCBFunc0), &m_hThread[0], (ViewSize0.cx*ViewSize0.cy*bpp0)/8);
if (retval0 != J_ST_SUCCESS) {
AfxMessageBox(CString("Could not open stream0!"), MB_OK | MB_ICONEXCLAMATION);
return;
}
TRACE("Opening stream0 succeeded\n");
retval1 = J_Image_OpenStream(m_hCam[1], 0, reinterpret_cast<J_IMG_CALLBACK_OBJECT>(this), reinterpret_cast<J_IMG_CALLBACK_FUNCTION>(&COpenCVSample1Dlg::StreamCBFunc1), &m_hThread[1], (ViewSize1.cx*ViewSize1.cy*bpp1)/8);
if (retval1 != J_ST_SUCCESS) {
AfxMessageBox(CString("Could not open stream1!"), MB_OK | MB_ICONEXCLAMATION);
return;
}
TRACE("Opening stream1 succeeded\n");
const char *filename0 = "C:\\Users\\shenyang\\Desktop\\test0.avi";
const char *filename1 = "C:\\Users\\shenyang\\Desktop\\test1.avi";
int fps = 10; //frame per second
int codec = -1;//choose the compression method
writer0 = …
Run Code Online (Sandbox Code Playgroud) 我对c ++做的很少,所以对我这么做.
我想在.avi视频文件中读取我正在制作的程序.我将文件位置保存为string
.有没有关于在c ++中使用.avi文件的好教程,还是有人知道读一个人的内容?它和普通文件一样吗?
谢谢您的帮助.我在网上看,但我发现的每个帖子都是一个悬而未决的问题.
编辑根据要求,这是一个小解释.我有一个先前提出的SO问题更详细,但这是我想要做的:
我正在制作一个可以检测面部的程序(虽然是OpenCV)截至目前,我已经获得了一个视频处理器程序,它将检测一个帧上的每个面部,并将该帧作为图像和CvRec
面部返回.我想拍摄这些面孔并测试它们以验证它们都是真正的面孔.
在我拥有所有面孔(经过测试)后,我想拍摄图像并一起测试它们.我测试每个帧上的面的大小和距离变化.如果面部通过这个帧长度为两秒,那么我想裁剪面部并使其成为每帧的主题.
在裁剪每个帧之后,我想为用户保存新的视频文件.
希望这会有所帮助.如果有人需要更好的解释,请告诉我.
如何在Flash中加载和播放.avi或.mpg4?那可能吗 ?
- >这个类可以播放.flv和.mp4 ..但是对于.avi它显示错误"错误#2044:未处理的NetStatusEvent:.level = error,code = NetStream.Play.StreamNotFound"
package src {
import flash.display.Sprite;
import flash.media.Video;
import flash.net.NetConnection;
import flash.net.NetStream;
import flash.events.Event;
import flash.events.MouseEvent;
public class vplayer extends Sprite{
public var vid:Video = new Video(1920,1080);
private var nc:NetConnection = new NetConnection();
public var ns:NetStream;
public var listener:Object = new Object();
private var _duration:Number = 0;
public function vplayer():void{
addChild(vid);
nc.connect(null);
ns = new NetStream(nc);
vid.attachNetStream(ns);
listener.onMetaData = metaDataHandler;
ns.client = listener;
//customClient.onCuePoint = cuePointHandler;
}
public function playVideo00(vv:String):void{
ns.play(vv);
} …
Run Code Online (Sandbox Code Playgroud) 有人能告诉我如何使用FireMonkey播放AVI文件吗?我应该使用哪个组件?
我在所有组件中搜索但没有找到任何有用的东西.