【AVD】视频解码时如何获取 coded_width coded_height 即参与编码的宽高

基于字节对齐、宏块宽高等因素,导致一个宽 w 高 h 的视频其实际参与编码的某一帧的宽高并不一定等于 w 和 h,而是有一个 ffmpeg 称之为 coded_width 及 coded_height 的编码宽高。出于另一些原因,例如数据送出与读取、数据加载到纹理等需求,不仅需要知道 w h,还需要知道其 coded_width 及 coded_height(以下简称 cw ch),那么该如何尽可能早地获取到这两个值呢?

解码之前获取不到 cw ch

参考着 FFmpeg 源码中的示例编写的编解码库,使用 avformat_open_input(&format_context, filename, nullptr, nullptr) 打开文件,然后用 avformat_find_stream_info(format_context, nullptr) 查找文件的流信息,再用 int stream_id = av_find_best_stream(format_context, AVMEDIA_TYPE_VIDEO, -1, -1, nullptr, false) 获取到视频流的 id,由此即可获取到该文件的视频流信息,其大部分主要信息存储于 format_context->streams[stream_id]->codecpar 这个参数中。包括宽、高、颜色格式、比特率、编码格式、采样宽高比等;而另一些诸如时长、帧数、帧率、时间基等信息也存在于上一层的 format_context->streams[stream_id] 这个 AVStream 结构体变量中。
而以上这些信息里,并没有 coded_width 及 coded_height 这两个信息。通过查 FFmpeg 源码可知,这两个变量是存储于结构体 AVCodecContext 中的,早一些的版本里,AVStream 结构体貌似还有个 AVCodecContext 变量,但 5.0 之后的版本已经去除。那该怎么获取呢?
如上图所示该视频宽为 1080 但参与编码的宽为 1088

如上图所示该视频宽为 1080 但参与编码的宽为 1088,忽然想到,使用命令行 ffprobe -show_streams -show_format 查看文件信息的时候是有这个参数打印的,那么,看一下 ffprobe 的源码不就行了?

查源码

其实全局搜索 coded_width 的时候,出现在比较靠前的搜索结果,或者说第一个存在于 c 文件中的搜索结果就来自 ffprobe.c 这个文件,点过去看,对比其代码上下文及上图 ffprobe 的输出信息,看起来就是打印上图信息的代码位置。
在这里插入图片描述
而这个 dec_ctx 就是个 AVCodecContext *,那它是怎么获取到的呢?找到上图这段代码的函数起始发现,dec_ctx 来自参数 InputStream *ist

static int show_stream(WriterContext *w, AVFormatContext *fmt_ctx, int stream_idx, InputStream *ist, int in_program)
{
   
   
    AVStream *stream = ist->st;
    AVCodecParameters *par;
    AVCodecContext *dec_ctx;
    char val_str[128];
    const char *s;
    AVRational sar, dar;
    AVBPrint pbuf;
    
<think>我们正在处理用户关于AndroidStudio中模拟器进程终止的问题。用户遇到了“emulatorprocessterminatedforAVDPixel_9_Pro_XL”的错误。我们将参考站内引用[1]中提供的解决方案,但要注意用户使用的是Pixel_9_Pro_XL,可能涉及不同的配置。根据引用[1],常见的解决方案是重新安装AndroidEmulator。具体步骤为:1.打开AndroidStudio,进入Tools>SDKManager>SDKTools。2.取消选中“AndroidEmulator”,然后点击“Apply”以删除当前安装的模拟器。3.然后重新选中“AndroidEmulator”(默认会显示一个版本,例如30.6.5或更),点击“Apply”重新安装。此外,引用[1]提到在2021年7月1日,最新版本的模拟器(30.7.5)解决了该问题。因此,确保安装最新版本的模拟器至关重要。但是,用户的问题可能还有其他原因,因此我们提供更全面的解决方案:解决方案步骤:1.**更新AndroidStudio和SDK工具**:确保使用最新版本的AndroidStudio和SDK工具。在AndroidStudio中,检查更新(Help>CheckforUpdates)并安装所有可用更新。2.**重新安装AndroidEmulator**(如引用所述):-打开AndroidStudio,进入Tools>SDKManager>SDKTools。-取消选中“AndroidEmulator”,点击Apply(这将卸载当前模拟器)。-然后重新选中“AndroidEmulator”(确保选择最新版本),点击Apply重新安装。3.**检查AVD配置**:-打开AVDManager(Tools>AVDManager)。-选择有问题的AVD(Pixel_9_Pro_XL),点击编辑(铅笔图标)。-检查配置,特别是“Graphics”选项。如果当前设置为“Automatic”或“Hardware”,尝试改为“Software”或反之。有图形加速问题会导致模拟器崩溃。4.**增加模拟器的内存设置**:-在编辑AVD,检查“MemoryandStorage”部分。如果分配的内存过大(例如超过机器可用内存),可能导致问题。尝试减少RAM分配(例如1536MB)。5.**检查系统环境**:-确保系统满足运行模拟器的要求,特别是虚拟化支持(IntelHAXM或WindowsHypervisorPlatform)已启用。可以在BIOS中检查虚拟化支持。-对于Windows用户,确保开启Hyper-V或WindowsHypervisorPlatform(根据AndroidStudio要求)。在Windows功能中检查。6.**清除AVD缓存**:-关闭AndroidStudio。-删除AVD的缓存目录。通常位于用户目录下的`.android/avd`目录中,找到对应的AVD文件夹(例如`Pixel_9_Pro_XL.avd`),删除其中的`cache`文件夹和`userdata-qemu.img`文件(注意:这会导致重置AVD,但可以解决缓存损坏问题)。7.**创建新的AVD**:如果以上步骤无效,尝试创建一个新的AVD,使用相同的系统映像但不同的配置(例如不同的图形选项或内存设置)。8.**查看日志**:-当模拟器崩溃,查看AndroidStudio的日志(View>ToolWindows>Logcat)或事件日志(View>ToolWindows>EventLog)以获取错误详情。-也可以尝试从命令行启动模拟器,进入SDK目录下的`emulator`文件夹,运行:```emulator-avdPixel_9_Pro_XL-logcatoutput.log```然后检查output.log文件中的错误信息。9.**检查防火墙和杀毒软件**:有防火墙或杀毒软件会阻止模拟器进程。尝试暂禁用它们,然后运行模拟器。10.**更新显卡驱动**:过的显卡驱动可能导致图形问题,更新到最新驱动。如果以上步骤仍然无法解决问题,可能需要考虑系统兼容性或等待AndroidStudio的后续更新。注意:由于用户使用的是特定的AVD名称“Pixel_9_Pro_XL”,这可能是自定义的设备,请确保系统映像已正确下载。相关问题:1.如何更新AndroidStudio和SDK工具?2.如何检查虚拟化支持是否开启?3.如何从命令行启动AVD获取日志?4.如何调整AVD的内存设置?5.如何创建新的AVD?我们提供了详细的步骤,用户可以根据情况逐一尝试。</think>### 解决 Android 虚拟设备 (AVD) 模拟器进程终止问题 当遇到 `emulator process terminated for AVD Pixel_9_Pro_XL` 错误,通常由以下原因导致: - Android Emulator 版本兼容性问题 - 图形驱动/渲染模式冲突 - AVD 缓存损坏或配置错误 - 虚拟化支持未启用 --- ### 解决方案步骤 #### 1. **更新/重装 Android Emulator**(核心方案) 这是最有效的解决方案[^1]: 1. 打开 Android Studio → **Tools > SDK Manager > SDK Tools** 2. **取消勾选** ✔️ `Android Emulator` → 点击 **Apply**(卸载当前版本) 3. 重新**勾选** `Android Emulator` → 选择**最新稳定版本**(如 33.1.10+)→ 点击 **Apply** 安装 4. 重启 Android Studio #### 2. **修改图形渲染模式** 1. 打开 AVD Manager → 选择 `Pixel_9_Pro_XL` → 点击 **Edit**(铅笔图标) 2. 在 **Advanced Settings** 中找到 **Graphics** 选项: - 尝试 `Software`(兼容性最好) - 或 `Automatic` → 保存更改 ![](https://developer.android.com/static/images/studio/avd/graphics-renderer.png) *图:修改图形渲染设置[^2]* #### 3. **清除 AVD 缓存** 1. 关闭 Android Studio 2. 删除缓存文件: ```bash # Windows del %USERPROFILE%\.android\avd\Pixel_9_Pro_XL.avd\cache* /q # macOS/Linux rm ~/.android/avd/Pixel_9_Pro_XL.avd/cache.* ``` 3. 重新启动 AVD #### 4. **启用硬件虚拟化** - **Windows**: - BIOS 中启用 **Intel VT-x** 或 **AMD-V** - 系统功能中启用 **Hyper-V** 或 **Windows Hypervisor Platform** - **macOS**: 终端执行: ```bash sysctl -a | grep machdep.cpu.features ``` 确认输出包含 `VMX`(Intel)或 `SVM`(AMD) #### 5. **检查磁盘空间** 确保系统盘剩余空间 > 15GB(模拟器需要临空间) #### 6. **创建新 AVD(备用方案)** 若以上无效,重建 AVD: 1. AVD Manager → 删除 `Pixel_9_Pro_XL` 2. 新建 AVD: - **Device**:选择 `Pixel 9 Pro`(非自定义名称) - **System Image**:下载 **Google Play** 版本(更稳定) - **Graphics**:首选 `Software` --- ### 验证解决 通过命令行启动模拟器并查看日志: ```bash cd $ANDROID_HOME/emulator emulator -avd Pixel_9_Pro_XL -logcat > emulator_log.txt ``` 检查日志中是否有 `GPU emulation failed` 或 `Failed to open /dev/kvm` 等关键错误。 --- ### 相关问题 1. 如何检查 Android Emulator 的当前版本? 2. 为什么修改图形渲染模式能解决模拟器崩溃问题? 3. 除了重装模拟器,还有哪些方法修复 AVD 配置损坏? 4. 如何在 BIOS 中启用硬件虚拟化(针对不同品牌主板)? 5. 模拟器启动报错 `/dev/kvm permission denied` 该如何解决? > 提示:若问题持续,请提供命令行日志中的关键错误行,以便进一步诊断。 [^1]: 参考重装模拟器解决方案:卸载并安装最新版 Android Emulator 可解决 80% 的进程终止问题。 [^2]: 来源:[Android 官方文档 - 配置硬件加速](https://developer.android.com/studio/run/emulator-acceleration)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

深海Enoch

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值