Exemple de code — Formats de sortie personnalisés¶
Exemples de code Delphi, C++ MFC et VB6.
Actuellement, il existe plusieurs options pour connecter des filtres DirectShow tiers afin d'obtenir le format nécessaire.
Première option — 3 filtres DirectShow différents¶
Un codec audio, un codec vidéo et un multiplexeur — des filtres distincts. Vous pouvez utiliser à la fois des filtres DirectShow et des codecs ordinaires comme codecs.
Deuxième option — un filtre DirectShow tout-en-un¶
Un multiplexeur, un codec vidéo et un codec audio — le même filtre.
Une autre différence concerne la capacité du filtre à écrire lui-même dans un fichier, l'utilisation du filtre File Writer standard ou la nécessité d'un autre filtre spécifique.
Dans les deux premiers cas, VisioForge Video Capture le détectera automatiquement et définira les paramètres nécessaires, mais vous devrez spécifier vous-même le filtre nécessaire dans le troisième cas.
Voyons maintenant à quoi ressemble le code pour les différentes options.
Première option¶
Obtenir les listes de codecs audio et vidéo
for I := 0 to VideoCapture1.Video_Codecs_GetCount - 1 do
cbCustomVideoCodec.Items.Add(VideoCapture1.Video_Codecs_GetItem(i));
for I := 0 to VideoCapture1.Audio_Codecs_GetCount - 1 do
cbCustomAudioCodec.Items.Add(VideoCapture1.Audio_Codecs_GetItem(i));
// C++ MFC
for (int i = 0; i < m_VideoCapture.Video_Codecs_GetCount(); i++)
m_CustomVideoCodecCombo.AddString(m_VideoCapture.Video_Codecs_GetItem(i));
for (int i = 0; i < m_VideoCapture.Audio_Codecs_GetCount(); i++)
m_CustomAudioCodecCombo.AddString(m_VideoCapture.Audio_Codecs_GetItem(i));
' VB6
For i = 0 To VideoCapture1.Video_Codecs_GetCount - 1
cbCustomVideoCodec.AddItem VideoCapture1.Video_Codecs_GetItem(i)
Next i
For i = 0 To VideoCapture1.Audio_Codecs_GetCount - 1
cbCustomAudioCodec.AddItem VideoCapture1.Audio_Codecs_GetItem(i)
Next i
Obtenir la liste des filtres DirectShow
for I := 0 to VideoCapture1.DirectShow_Filters_GetCount - 1 do
begin
cbCustomDSFilterV.Items.Add(VideoCapture1.DirectShow_Filters_GetItem(i));
cbCustomDSFilterA.Items.Add(VideoCapture1.DirectShow_Filters_GetItem(i));
cbCustomMuxer.Items.Add(VideoCapture1.DirectShow_Filters_GetItem(i));
cbCustomFilewriter.Items.Add(VideoCapture1.DirectShow_Filters_GetItem(i));
end;
// C++ MFC
for (int i = 0; i < m_VideoCapture.DirectShow_Filters_GetCount(); i++)
{
m_CustomDSFilterVCombo.AddString(m_VideoCapture.DirectShow_Filters_GetItem(i));
m_CustomDSFilterACombo.AddString(m_VideoCapture.DirectShow_Filters_GetItem(i));
m_CustomMuxerCombo.AddString(m_VideoCapture.DirectShow_Filters_GetItem(i));
m_CustomFilewriterCombo.AddString(m_VideoCapture.DirectShow_Filters_GetItem(i));
}
' VB6
For i = 0 To VideoCapture1.DirectShow_Filters_GetCount - 1
cbCustomDSFilterV.AddItem VideoCapture1.DirectShow_Filters_GetItem(i)
cbCustomDSFilterA.AddItem VideoCapture1.DirectShow_Filters_GetItem(i)
cbCustomMuxer.AddItem VideoCapture1.DirectShow_Filters_GetItem(i)
cbCustomFilewriter.AddItem VideoCapture1.DirectShow_Filters_GetItem(i)
Next i
Sélectionner les filtres et codecs
if rbCustomUseVideoCodecsCat.Checked then
begin
VideoCapture1.Custom_Output_Video_Codec := cbCustomVideoCodec.Items[cbCustomVideoCodec.ItemIndex];
VideoCapture1.Custom_Output_Video_Codec_Use_Filters_Category := false;
end
else
begin
VideoCapture1.Custom_Output_Video_Codec := cbCustomDSFilterV.Items[cbCustomDSFilterV.ItemIndex];
VideoCapture1.Custom_Output_Video_Codec_Use_Filters_Category := true;
end;
if rbCustomUseAudioCodecsCat.Checked then
begin
VideoCapture1.Custom_Output_Audio_Codec := cbCustomAudioCodec.Items[cbCustomAudioCodec.ItemIndex];
VideoCapture1.Custom_Output_Audio_Codec_Use_Filters_Category := false;
end
else
begin
VideoCapture1.Custom_Output_Audio_Codec := cbCustomDSFilterA.Items[cbCustomDSFilterA.ItemIndex];
VideoCapture1.Custom_Output_Audio_Codec_Use_Filters_Category := true;
end;
VideoCapture1.Custom_Output_Mux_Filter_Name := cbCustomMuxer.Items[cbCustomMuxer.ItemIndex];
// C++ MFC
// CComboBox::GetCurSel renvoie CB_ERR (-1) si rien n'est sélectionné ; on
// vérifie l'index avant chaque appel à GetLBText.
int nIndex;
if (m_CustomUseVideoCodecsCat.GetCheck())
{
nIndex = m_CustomVideoCodecCombo.GetCurSel();
if (nIndex != CB_ERR)
{
CString videoCodec;
m_CustomVideoCodecCombo.GetLBText(nIndex, videoCodec);
m_VideoCapture.Custom_Output_Video_Codec = videoCodec;
m_VideoCapture.Custom_Output_Video_Codec_Use_Filters_Category = false;
}
}
else
{
nIndex = m_CustomDSFilterVCombo.GetCurSel();
if (nIndex != CB_ERR)
{
CString videoCodec;
m_CustomDSFilterVCombo.GetLBText(nIndex, videoCodec);
m_VideoCapture.Custom_Output_Video_Codec = videoCodec;
m_VideoCapture.Custom_Output_Video_Codec_Use_Filters_Category = true;
}
}
if (m_CustomUseAudioCodecsCat.GetCheck())
{
nIndex = m_CustomAudioCodecCombo.GetCurSel();
if (nIndex != CB_ERR)
{
CString audioCodec;
m_CustomAudioCodecCombo.GetLBText(nIndex, audioCodec);
m_VideoCapture.Custom_Output_Audio_Codec = audioCodec;
m_VideoCapture.Custom_Output_Audio_Codec_Use_Filters_Category = false;
}
}
else
{
nIndex = m_CustomDSFilterACombo.GetCurSel();
if (nIndex != CB_ERR)
{
CString audioCodec;
m_CustomDSFilterACombo.GetLBText(nIndex, audioCodec);
m_VideoCapture.Custom_Output_Audio_Codec = audioCodec;
m_VideoCapture.Custom_Output_Audio_Codec_Use_Filters_Category = true;
}
}
nIndex = m_CustomMuxerCombo.GetCurSel();
if (nIndex != CB_ERR)
{
CString muxerName;
m_CustomMuxerCombo.GetLBText(nIndex, muxerName);
m_VideoCapture.Custom_Output_Mux_Filter_Name = muxerName;
}
' VB6
If rbCustomUseVideoCodecsCat.Value Then
VideoCapture1.Custom_Output_Video_Codec = cbCustomVideoCodec.List(cbCustomVideoCodec.ListIndex)
VideoCapture1.Custom_Output_Video_Codec_Use_Filters_Category = False
Else
VideoCapture1.Custom_Output_Video_Codec = cbCustomDSFilterV.List(cbCustomDSFilterV.ListIndex)
VideoCapture1.Custom_Output_Video_Codec_Use_Filters_Category = True
End If
If rbCustomUseAudioCodecsCat.Value Then
VideoCapture1.Custom_Output_Audio_Codec = cbCustomAudioCodec.List(cbCustomAudioCodec.ListIndex)
VideoCapture1.Custom_Output_Audio_Codec_Use_Filters_Category = False
Else
VideoCapture1.Custom_Output_Audio_Codec = cbCustomDSFilterA.List(cbCustomDSFilterA.ListIndex)
VideoCapture1.Custom_Output_Audio_Codec_Use_Filters_Category = True
End If
VideoCapture1.Custom_Output_Mux_Filter_Name = cbCustomMuxer.List(cbCustomMuxer.ListIndex)
Deuxième option¶
Obtenir les listes de filtres DirectShow.
for I := 0 to VideoCapture1.DirectShow_Filters_GetCount - 1 do
begin
cbCustomDSFilterV.Items.Add(VideoCapture1.DirectShow_Filters_GetItem(i));
cbCustomDSFilterA.Items.Add(VideoCapture1.DirectShow_Filters_GetItem(i));
cbCustomMuxer.Items.Add(VideoCapture1.DirectShow_Filters_GetItem(i));
cbCustomFilewriter.Items.Add(VideoCapture1.DirectShow_Filters_GetItem(i));
end;
// C++ MFC
for (int i = 0; i < m_VideoCapture.DirectShow_Filters_GetCount(); i++)
{
m_CustomDSFilterVCombo.AddString(m_VideoCapture.DirectShow_Filters_GetItem(i));
m_CustomDSFilterACombo.AddString(m_VideoCapture.DirectShow_Filters_GetItem(i));
m_CustomMuxerCombo.AddString(m_VideoCapture.DirectShow_Filters_GetItem(i));
m_CustomFilewriterCombo.AddString(m_VideoCapture.DirectShow_Filters_GetItem(i));
}
' VB6
For i = 0 To VideoCapture1.DirectShow_Filters_GetCount - 1
cbCustomDSFilterV.AddItem VideoCapture1.DirectShow_Filters_GetItem(i)
cbCustomDSFilterA.AddItem VideoCapture1.DirectShow_Filters_GetItem(i)
cbCustomMuxer.AddItem VideoCapture1.DirectShow_Filters_GetItem(i)
cbCustomFilewriter.AddItem VideoCapture1.DirectShow_Filters_GetItem(i)
Next i
Sélectionner le filtre multiplexeur (mux)
VideoCapture1.Custom_Output_Mux_Filter_Name := cbCustomMuxer.Items[cbCustomMuxer.ItemIndex];
VideoCapture1.Custom_Output_Mux_Filter_Is_Encoder := cbCustomMuxFilterIsEncoder.Checked;
// C++ MFC
CString muxerName;
m_CustomMuxerCombo.GetLBText(m_CustomMuxerCombo.GetCurSel(), muxerName);
m_VideoCapture.Custom_Output_Mux_Filter_Name = muxerName;
m_VideoCapture.Custom_Output_Mux_Filter_Is_Encoder = m_CustomMuxFilterIsEncoder.GetCheck();
' VB6
VideoCapture1.Custom_Output_Mux_Filter_Name = cbCustomMuxer.List(cbCustomMuxer.ListIndex)
VideoCapture1.Custom_Output_Mux_Filter_Is_Encoder = cbCustomMuxFilterIsEncoder.Value
Si vous avez besoin d'un filtre File Writer spécial, vous devez le spécifier. Cela vaut pour les deux options décrites ci-dessus.
VideoCapture1.Custom_Output_Special_FileWriter_Needed := cbUseSpecialFilewriter.Checked;
VideoCapture1.Custom_Output_Special_FileWriter_Filter_Name := cbCustomFilewriter.Items[cbCustomFilewriter.ItemIndex];
// C++ MFC
m_VideoCapture.Custom_Output_Special_FileWriter_Needed = m_UseSpecialFilewriter.GetCheck();
CString fileWriterName;
m_CustomFilewriterCombo.GetLBText(m_CustomFilewriterCombo.GetCurSel(), fileWriterName);
m_VideoCapture.Custom_Output_Special_FileWriter_Filter_Name = fileWriterName;
' VB6
VideoCapture1.Custom_Output_Special_FileWriter_Needed = cbUseSpecialFilewriter.Value
VideoCapture1.Custom_Output_Special_FileWriter_Filter_Name = cbCustomFilewriter.List(cbCustomFilewriter.ListIndex)
Démarrer la capture
VideoCapture1.Start;
// C++ MFC
m_VideoCapture.Start();
' VB6
VideoCapture1.Start
Veuillez contacter le support pour obtenir de l'aide sur ce tutoriel. Visitez notre page GitHub pour davantage d'exemples de code.