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

.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

打开https://ffmpeg.org/download.html,下载指定的压缩包

然后向下找到指定文件

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

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

shell 复制代码
ffmpeg -version

python代码

py 复制代码
import os
import subprocess
import argparse
import sys


def check_ffmpeg():
    """检查FFmpeg是否已安装并可访问"""
    try:
        subprocess.run(['ffmpeg', '-version'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=True)
        return True
    except (subprocess.SubprocessError, FileNotFoundError):
        return False


def convert_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)
            return False

        return True

    except Exception as e:
        print(f"处理文件时出错 {input_path}: {str(e)}", file=sys.stderr)
        return False


def batch_convert(folder_path, reencode=False, crf=23, overwrite=False):
    """
    批量转换文件夹中的所有.264和.h264文件

    参数:
        folder_path: 包含视频文件的文件夹路径
        reencode: 是否重新编码
        crf: 重新编码时的质量参数
        overwrite: 是否覆盖已存在的文件
    """
    if not os.path.isdir(folder_path):
        print(f"错误: 文件夹 '{folder_path}' 不存在", file=sys.stderr)
        return 0, 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)

    if not video_files:
        print(f"在 '{folder_path}' 中未找到任何.264或.h264文件")
        return 0, 0

    success_count = 0
    fail_count = 0

    print(f"找到 {len(video_files)} 个视频文件,开始转换...")

    for i, filename in enumerate(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) and not overwrite:
            print(f"({i}/{len(video_files)}) 已存在,跳过: {output_filename}")
            continue

        print(f"({i}/{len(video_files)}) 正在转换: {filename}")
        if convert_file(input_path, output_path, reencode, crf):
            success_count += 1
            print(f"({i}/{len(video_files)}) 转换成功: {output_filename}")
        else:
            fail_count += 1
            print(f"({i}/{len(video_files)}) 转换失败: {filename}")

    return success_count, fail_count


def main():
    # 检查FFmpeg是否安装
    if not check_ffmpeg():
        print("错误: 未找到FFmpeg。请先安装FFmpeg并确保它在系统PATH中。", file=sys.stderr)
        print("安装指南: https://ffmpeg.org/download.html", 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:
            # 单个文件转换
            if not os.path.isfile(args.file):
                print(f"错误: 文件 '{args.file}' 不存在", file=sys.stderr)
                sys.exit(1)

            lower_file = args.file.lower()
            if not (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 and not 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) and not 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(0 if fail == 0 else 1)

    except Exception as e:
        print(f"发生错误: {str(e)}", file=sys.stderr)
        sys.exit(1)


if __name__ == "__main__":
    main()
相关推荐
我要学习别拦我~3 小时前
Python 中常用的数据分析绘图库解析
python·数据分析
芊言芊语3 小时前
华为云产品体系选择
python
起个名字费劲死了3 小时前
Pytorch Yolov11 OBB 旋转框检测+window部署+推理封装 留贴记录
c++·人工智能·pytorch·python·深度学习·yolo·机器人
用户785127814703 小时前
淘宝获取商品详情数据API接口PC端和App端的实际操作指南
python
神仙别闹3 小时前
基于 Python 模式识别(纹理图片里的目标检测)
python·目标检测·目标跟踪
浆果02073 小时前
FFmpeg安装(Windows)
windows·ffmpeg
小狮子安度因3 小时前
FFmpeg过滤器之crop
ffmpeg
风间琉璃•4 小时前
FFmpeg视频编解码
ffmpeg·视频编解码