C++音视频八股文(编程基础)

1. 如何读取一个视频文件的基本信息(时长、分辨率、码率等)?

  1. 使用ffprobe命令:ffprobe是FFmpeg提供的媒体分析工具,专门用于读取文件信息,命令是ffprobe input.mp4
  2. 获取JSON格式:使用ffprobe -v quiet -print_format json -show_format -show_streams input.mp4输出结构化数据,便于程序解析
  3. 获取特定信息:使用-show_entries参数只显示需要的字段,如ffprobe -v error -show_entries format=duration,bit_rate -of default=noprint_wrappers=1 input.mp4
  4. 编程方式:使用avformat_open_input打开文件,avformat_find_stream_info获取流信息,从AVFormatContext读取duration、bit_rate,从AVStream读取width、height、codec_name等
  5. 常用信息位置:时长在format.duration,总码率在format.bit_rate,分辨率在stream.width和stream.height,编码格式在stream.codec_name,帧率在stream.r_frame_rate
  6. 简化命令:使用ffmpeg -i input.mp4直接查看,虽然会报错但会输出文件信息

2. 如何判断一个视频文件是否包含音频流?

  1. 使用ffprobe:ffprobe -v error -select_streams a -show_entries stream=codec_type -of default=nw=1:nk=1 input.mp4,有输出说明有音频流
  2. 检查流数量:ffprobe -v error -show_entries format=nb_streams -of default=nw=1:nk=1 input.mp4查看总流数,再用-select_streams a:0检查音频流
  3. 编程方式:遍历AVFormatContext的streams数组,检查每个AVStream的codecpar->codec_type是否等于AVMEDIA_TYPE_AUDIO
  4. 使用av_find_best_stream:调用av_find_best_stream(fmt_ctx, AVMEDIA_TYPE_AUDIO, -1, -1, NULL, 0),返回值大于等于0说明有音频流
  5. 简单判断:运行ffmpeg -i input.mp4,查看输出信息中是否有Audio行

3. 如何实现一个简单的YUV播放器?

  1. 读取YUV文件:YUV是原始数据无文件头,需要知道分辨率和格式,使用fread按帧读取,每帧大小是width×height×1.5(YUV420)
  2. 计算帧大小:YUV420格式,Y平面width×height字节,U平面width×height/4字节,V平面width×height/4字节
  3. 转换为RGB:使用libswscale的sws_scale将YUV转换为RGB,创建SwsContext指定源格式AV_PIX_FMT_YUV420P和目标格式AV_PIX_FMT_RGB24
  4. 显示画面:使用SDL库创建窗口和渲染器,将RGB数据上传到纹理,渲染到屏幕,SDL_RenderPresent刷新显示
  5. 控制帧率:使用SDL_Delay或计时器控制播放速度,如25fps每帧延迟40ms
  6. 循环播放:读取完文件后fseek回到开头,或使用循环缓冲区
  7. 关键代码流程:初始化SDL→打开YUV文件→循环读取帧→YUV转RGB→渲染显示→延迟控制→清理资源

4. 如何实现一个简单的PCM音频播放器?

  1. 读取PCM文件:PCM是原始音频数据,需要知道采样率、位深度、声道数,使用fread读取数据
  2. 初始化音频设备:使用SDL_OpenAudio或SDL_OpenAudioDevice,设置SDL_AudioSpec参数(采样率、格式、声道数、缓冲区大小、回调函数)
  3. 音频回调:SDL通过回调函数获取音频数据,在回调中从缓冲区读取PCM数据填充到stream,注意线程安全
  4. 缓冲区管理:使用环形缓冲区,主线程读取文件写入缓冲区,音频线程从缓冲区读取播放,避免阻塞
  5. 开始播放:SDL_PauseAudio(0)开始播放,SDL会自动调用回调函数获取数据
  6. 音量控制:在回调中对PCM数据进行缩放,或使用SDL_MixAudio混音
  7. 关键流程:初始化SDL音频→打开PCM文件→设置音频参数→注册回调函数→开始播放→循环填充缓冲区→清理资源

5. 如何使用FFmpeg命令行工具进行视频转码?

  1. 基本转码:ffmpeg -i input.mp4 output.avi,FFmpeg自动选择编码器和参数
  2. 指定视频编码器:使用-c:v或-vcodec参数,如ffmpeg -i input.mp4 -c:v libx264 output.mp4使用H.264编码
  3. 指定音频编码器:使用-c:a或

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

C++八股文全集 文章被收录于专栏

本专栏系统梳理C++技术面试核心考点,涵盖语言基础、面向对象、内存管理、STL容器、模板编程及经典算法。从引用指针、虚函数表、智能指针等底层原理,到继承多态、运算符重载等OOP特性从const、static、inline等关键字辨析,到动态规划、KMP算法、并查集等手写实现。每个知识点以面试答题形式呈现,注重原理阐述而非冗长代码,帮助你快速构建完整知识体系,从容应对面试官提问,顺利拿下offer。

全部评论

相关推荐

01-27 22:50
武汉大学 Java
点赞 评论 收藏
分享
评论
2
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务