.h264或.264视频文件转化成mp4视频


.h264(也常写作.264)并非传统意义上包含音频、视频封装的 “完整视频文件格式”(如 MP4、MKV),而是 H.264/AVC(Advanced Video Coding,高级视频编码)标准对应的原始视频码流文件格式 ,仅存储视频编码数据,不包含音频流或容器结构,是多媒体领域应用最广泛的视频编码格式之一。

​ 从技术核心来看,H.264 编码通过帧内预测、帧间预测、熵编码等关键技术,在保证较高视频画质的同时,实现了极高的压缩效率 —— 相比早期的 MPEG-2 编码,在相同画质下可将视频文件体积压缩 50% 以上,这一特性使其成为平衡 “画质” 与 “存储 / 传输成本” 的核心选择。例如,1080P 分辨率的视频经 H.264 编码后,仅需 2-8Mbps 的码率即可呈现清晰画面,既能满足在线视频平台的流畅传输需求,也能减少本地存储占用。

​ 在应用场景上,.h264 格式几乎覆盖了多媒体领域的全场景:在线视频平台(如早期 YouTube、国内短视频平台)的视频转码、安防监控系统的录像存储(占监控视频编码的绝大多数份额)、移动端视频拍摄(部分设备可输出 H.264 原始码流)、视频会议系统的实时传输,以及蓝光光盘、数字电视广播等传统领域,均以 H.264 作为核心编码标准。

​ 不过需注意,.h264 文件因仅含视频码流,无法直接用普通播放器(如 Windows Media Player)播放,需搭配对应的音频文件(如 AAC 格式音频),并封装为 MP4、MKV、TS 等容器格式后才能正常播放;若需直接处理.h264 文件,可通过 FFmpeg、Adobe Premiere 等工具进行解码、转码或封装操作。尽管当前 H.265/HEVC 等更高效的编码标准已逐步推广,但 H.264 凭借成熟的生态、广泛的设备兼容性(几乎所有终端设备都支持解码),仍在各类场景中保持着极高的使用率。

环境配置

需要安装一下FFmpeg

打开,下载指定的压缩包

然后向下找到指定文件

将下载好的压缩包放在自己心仪的位置,解压后添加环境变量

验证安装,打开终端,输入

ffmpeg -version

python代码

import os
import subprocess
import argparse
import sys
defcheck_ffmpeg():"""检查FFmpeg是否已安装并可访问"""try:
        subprocess.run(['ffmpeg','-version'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=True)returnTrueexcept(subprocess.SubprocessError, FileNotFoundError):returnFalsedefconvert_file(input_path, output_path, reencode=False, crf=23):"""
    转换单个.264或.h264文件为MP4
    参数:
        input_path: 输入的视频文件路径
        output_path: 输出的.mp4文件路径
        reencode: 是否重新编码,默认仅复制流
        crf: 重新编码时的质量参数,值越小质量越高(0-51)
    """try:# 构建FFmpeg命令
        cmd =['ffmpeg','-i', input_path,'-f','mp4','-y']if reencode:# 重新编码,兼容性更好但速度较慢
            cmd.extend(['-c:v','libx264','-crf',str(crf)])else:# 直接复制流,速度快且无质量损失
            cmd.extend(['-c:v','copy'])
        cmd.append(output_path)# 执行转换命令
        result = subprocess.run(
            cmd,
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE,
            text=True)if result.returncode !=0:print(f"转换失败: {result.stderr}",file=sys.stderr)returnFalsereturnTrueexcept Exception as e:print(f"处理文件时出错 {input_path}: {str(e)}",file=sys.stderr)returnFalsedefbatch_convert(folder_path, reencode=False, crf=23, overwrite=False):"""
    批量转换文件夹中的所有.264和.h264文件
    参数:
        folder_path: 包含视频文件的文件夹路径
        reencode: 是否重新编码
        crf: 重新编码时的质量参数
        overwrite: 是否覆盖已存在的文件
    """ifnot os.path.isdir(folder_path):print(f"错误: 文件夹 '{folder_path}' 不存在",file=sys.stderr)return0,0# 获取所有.264和.h264文件
    video_files =[]for f in os.listdir(folder_path):
        lower_f = f.lower()if(lower_f.endswith('.264')or lower_f.endswith('.h264'))and os.path.isfile(os.path.join(folder_path, f)):
            video_files.append(f)ifnot video_files:print(f"在 '{folder_path}' 中未找到任何.264或.h264文件")return0,0
    success_count =0
    fail_count =0print(f"找到 {len(video_files)} 个视频文件,开始转换...")for i, filename inenumerate(video_files,1):
        input_path = os.path.join(folder_path, filename)
        output_filename = os.path.splitext(filename)[0]+'.mp4'
        output_path = os.path.join(folder_path, output_filename)# 检查输出文件是否已存在if os.path.exists(output_path)andnot overwrite:print(f"({i}/{len(video_files)}) 已存在,跳过: {output_filename}")continueprint(f"({i}/{len(video_files)}) 正在转换: {filename}")if convert_file(input_path, output_path, reencode, crf):
            success_count +=1print(f"({i}/{len(video_files)}) 转换成功: {output_filename}")else:
            fail_count +=1print(f"({i}/{len(video_files)}) 转换失败: {filename}")return success_count, fail_count
defmain():# 检查FFmpeg是否安装ifnot check_ffmpeg():print("错误: 未找到FFmpeg。请先安装FFmpeg并确保它在系统PATH中。",file=sys.stderr)print("安装指南: ",file=sys.stderr)
        sys.exit(1)# 解析命令行参数
    parser = argparse.ArgumentParser(description='将.264或.h264文件转换为MP4格式')
    group = parser.add_mutually_exclusive_group(required=True)
    group.add_argument('-f','--file',help='单个.264或.h264文件的路径')
    group.add_argument('-d','--directory',help='包含.264或.h264文件的文件夹路径')
    parser.add_argument('-o','--output',help='输出文件路径(仅用于单个文件转换)')
    parser.add_argument('-r','--reencode', action='store_true',help='强制重新编码视频(默认仅复制流)')
    parser.add_argument('-c','--crf',type=int, default=23,help='重新编码时的CRF质量参数(0-51,默认23)')
    parser.add_argument('-w','--overwrite', action='store_true',help='覆盖已存在的输出文件')
    args = parser.parse_args()try:if args.file:# 单个文件转换ifnot os.path.isfile(args.file):print(f"错误: 文件 '{args.file}' 不存在",file=sys.stderr)
                sys.exit(1)
            lower_file = args.file.lower()ifnot(lower_file.endswith('.264')or lower_file.endswith('.h264')):print(f"错误: '{args.file}' 不是.264或.h264文件",file=sys.stderr)
                sys.exit(1)# 确定输出路径if args.output:
                output_path = args.output
                # 确保输出目录存在
                output_dir = os.path.dirname(output_path)if output_dir andnot os.path.exists(output_dir):
                    os.makedirs(output_dir, exist_ok=True)else:# 默认输出路径:与输入文件同目录,替换扩展名为.mp4
                output_path = os.path.splitext(args.file)[0]+'.mp4'# 检查输出文件是否已存在if os.path.exists(output_path)andnot args.overwrite:print(f"错误: 输出文件 '{output_path}' 已存在。使用 -w 选项覆盖它。",file=sys.stderr)
                sys.exit(1)print(f"正在转换文件: {args.file}")if convert_file(args.file, output_path, args.reencode, args.crf):print(f"转换成功!输出文件: {output_path}")
                sys.exit(0)else:print("转换失败",file=sys.stderr)
                sys.exit(1)elif args.directory:# 批量转换
            success, fail = batch_convert(
                args.directory,
                args.reencode,
                args.crf,
                args.overwrite
            )print("\n批量转换完成")print(f"成功: {success} 个文件")print(f"失败: {fail} 个文件")
            sys.exit(0if fail ==0else1)except Exception as e:print(f"发生错误: {str(e)}",file=sys.stderr)
        sys.exit(1)if __name__ =="__main__":
    main()