例子很简单
主流的视频格式是H264,音频格式是AAC
FFMPEG能解码,h264的视频码流解出来的YUV420裸视频流,转成RGB32格式,就可以用QT来直接画了
aac的音频码流解出来的PCM裸音频流,经过采样率的转换(44100或48000,转成合适的采样率),就可以播放了
FFMPEG的各API就不细说了,雷神的博客很详细
所谓视频,也就是一张张的图像,QT绘图,直接在paintEvent里画就好了
QT的音频播放如下
// 声音采样格式
QAudioFormat audio_format;
// 采样率
audio_format.setSampleRate(audio_codecctx->sample_rate);
// 通道数
audio_format.setChannelCount(audio_codecctx->channels);
// 采样大小,一般为8或16
audio_format.setSampleSize(8 * av_get_bytes_per_sample(AV_SAMPLE_FMT_S16));
// 编码方式
audio_format.setCodec("audio/pcm");
//设置字节序
audio_format.setByteOrder(QAudioFormat::LittleEndian);
//设置样本数据类型
audio_format.setSampleType(QAudioFormat::UnSignedInt);
//音频设备信息
QAudioDeviceInfo info = QAudioDeviceInfo::defaultOutputDevice();
if (!info.isFormatSupported(audio_format)) {
qDebug("default format not supported try to use nearest");
audio_format = info.nearestFormat(audio_format);
}
// 根据可支持的format new了一个音频输出对象
QAudioOutput *audioOutput = new QAudioOutput(audio_format, this);
QIODevice *streamOut = audioOutput->start();
......
//audio_out_buffer为解码转换后的pcm音频数据,直接写就好了
streamOut->write((char *)audio_out_buffer, out_buffer_size);
放一张效果图吧
具体的QT工程在这里,直接可以编译运行
https://download.csdn.net/download/Since_lily/13025855