央视视频下载2025年8月更新

2025年11月更新,我发现有的视频提供了未加密的高分辨率版本,但目前只找到了这一个例子,之前的都不行,猜测是CDN配置的问题。https://tv.cctv.com/2025/11/01/VIDEY6rLObeK9r7PHaPMQNZQ251101.shtml

央视最近又又又改加密算法了,网页段的h5e解密应该是没戏了。听说有人又搞出来了客户端的hls2解密,测试了一下可以用。当然能用多久就不好说了。毕竟现在的下载方法挂的越来越快了,且用且珍惜吧。

我自己让Ai写了个程序调用m3u8下载器,需要安装python和ffmpeg并添加环境变量

如果你不想安装python或者安不上,也可以去用GitHub上面的其他人做的版本,有GUI会更方便一点,下载地址在这里(国内网盘加速)

解密程序下载地址

https://radiance.lanzoub.com/is0Vt349pboh

把文件解压到一个没有中文名的目录下面,然后复制完整的路径

然后cd切换到这个目录

接下来输入python run.py 视频的GUID值

GUID值的获取之前说过了

遇到像这样红红的一大片不用管,会解密成功的

最后写一下等这个方法失效以后该怎么办吧

目前已经失效的方法:

HLS视频:2024年3月失效,后来有人补过一次但是2024年9月又失效了。

HLS视频(第三方域名):2024年11月失效。

MP4合并法:2024年2月被隐藏,今年年初被隐藏的更深了,但其实还能用,只是非常麻烦且有局限性。

H5E视频:8月初刚刚失效。

HLS2视频:目前有效,但估计撑不了几个月。

浏览器提取缓存法:这个方法永远不会失效,但是耗费的系统资源多,下载速度慢,而且有时会丢帧。B站上面有个软件实现了自动化可以看看

最后,CCTV在其它平台比如B站、YouTube、咪咕视频、央视频等网站上面也有账号,如果CCTV的视频下载不下来的话,不妨去这些平台看看。B站可以用bbdown油管用idm自带的视频嗅探就行。咪咕的话缓存视频改扩展名,或者f12+m3u8下载器都可。央视频的稍微麻烦点,得抓包or投屏,但也能下。而且这几个平台清晰度全比CCTV要高。

评论

  1. TH
    Android Chrome 131.0.6778.200
    2 月前
    2025-8-24 4:18:10

    h5e上VMP保护了,dhls2(央视影音缓存)不清楚还能坚持多久

    • TH
      TH
      Android Chrome 131.0.6778.200
      2 月前
      2025-8-24 4:21:12

      原先还有个能看下架视频的hls域名,但是8.1后这个域名就out了

      • Sky
        TH
        Windows Chrome 138.0.0.0
        2 月前
        2025-8-24 7:37:55

        原先那个域名是哪个啊

        • TH
          Sky
          Android Chrome 131.0.6778.200
          2 月前
          2025-8-24 14:02:16

          hls09.cntv.myhwcdn.cn

          • 博主
            TH
            Windows Chrome 138.0.0.0
            2 月前
            2025-8-24 14:16:08

            那个域名最开始就是我在GitHub上面公开的,为了防止它失效还特意屏蔽了所有中国大陆的流量,但是还是没挺过一个月。
            另外其实那批域名有好多个,我只公开了其中的两个,但是剩下的没公开的也挂了。

          • TH
            Sky
            Android Chrome 131.0.6778.200
            2 月前
            2025-8-24 18:59:01

            主要是ip138流放了这个域名

          • TH
            Sky
            Android Chrome 131.0.6778.200
            2 月前
            2025-8-24 19:08:03

            事实上去年还有一个dwk.cntv.qcloudcdn.com,那个域名当时还能看清晰的m3u8(看不了下架视频),当时10月和那个hlssnap域名也被央视网榨干了

          • 博主
            TH
            Android Chrome 140.0.7339.15
            2 月前
            2025-8-24 20:07:01

            现在其实下架视频还是能看的,只要能搞到guid并且服务器端没有删除文件就可以。目前能找到最早的视频是2005年的。

          • TH
            Sky
            Android Chrome 131.0.6778.200
            2 月前
            2025-8-25 3:27:08

            事实上hls域名的网宿cdn也是可以看下架视频的,跟看mp4和flv的方法是一样的,画质都是动了手脚的

          • 博主
            TH
            Android Chrome 140.0.7339.15
            2 月前
            2025-8-25 12:11:21

            老视频画质也没多高,本来就不清楚,用不花瓶的域名下就可以了。不过不知道它们为什么要把已经下架的视频也给转换成花屏的文件了,根本没必要啊。

  2. weaponjang
    Windows Chrome 137.0.0.0
    2 月前
    2025-8-25 12:29:57

    可能是央视cdn服务器的开销太大了,跨省结算后可能cdn涨价了,所以想方设法降本增效

    • 博主
      weaponjang
      Android Chrome 140.0.7339.15
      2 月前
      2025-8-26 8:44:23

      我之前也这么猜测过,因为23年我就抓包发现央视已经开始用PCDN了。另外央视海外的CDN已经撤光了,原来是阿卡迈,现在已经没了。

  3. weaponjang
    Windows Chrome 137.0.0.0
    2 月前
    2025-8-25 12:40:10

    这个cbox.exe是哪个时候的版本?怎么感觉大小和我从52pj论坛上下载的大小不一样呢,可惜没有版本号,不然还能知道新旧

    • 博主
      weaponjang
      Android Chrome 140.0.7339.15
      2 月前
      2025-8-26 8:43:02

      我也是从那上面下载的,应该是通用的版本吧,或者可能那边更新了我这边没更新。

      • weaponjang
        Sky
        Windows Chrome 137.0.0.0
        2 月前
        2025-8-27 10:21:01

        你的估计是旧版,我看更改时间你的是8月8日,他的是8月12日,我自己基于bun.js也写了个调用ffmpeg和ffprobe的下载器,源码如下,欢迎大佬们指摘

        // 基于bun.js,可打包成单个可执行程序文件
        const { join } = require('path');
        const { mkdir, rm } = require('fs/promises');
        const { spawn, spawnSync } = require('child_process');
        const { homedir } = require('os');
        const https = require('https');
        const readline = require('readline');
        
        const pdl = process.env.PUBLIC ? join(process.env.PUBLIC,'Downloads') : 'C:\\Users\\Public\\Downloads';
        // 配置常量 , 下载超时30分钟
        const CONFIG = {
            API_URL: "https://vdn.apps.cntv.cn/api/getHttpVideoInfo.do?pid={guid}&client=flash",
            PUBLIC_DOWNLOADS: pdl,
            TIMEOUT: 30 * 60 * 1000
        };
        
        const rl = readline.createInterface({
            input: process.stdin,
            output: process.stdout
        });
        
        // 全局替换
        function replaceAll(source, search, replacement){
          const parts = [];
          let lastIndex = 0;
          const searchLength = search.length;
        
          while (true) {
            const index = source.indexOf(search, lastIndex);
            if (index === -1) {
              parts.push(source.slice(lastIndex));
              break;
            }
            parts.push(source.slice(lastIndex, index), replacement);
            lastIndex = index + searchLength;
          }
        
          return parts.join("");
        }
        
        // 工具函数:获取视频元数据,超时30,000秒
        async function fetchVideoMeta(guid) {
            const url = CONFIG.API_URL.replace('{guid}', guid);
            const data = await new Promise(resolve => {
                const req = https.get(url, { timeout: 30000 }, res => {
                    let rawData = '';
                    res.on('data', chunk => rawData += chunk);
                    res.on('end', () => {
                        try { resolve(JSON.parse(rawData)); }
                        catch { resolve(null); }
                    });
                });
                req.on('error', () => resolve(null));
            });
        
            if (!data?.hls_url) throw new Error('API请求失败');
        
            const is4K = data.play_channel?.includes('4K') || false;
            const m3u8main = is4K ? data.hls_url : data.manifest?.hls_enc2_url ;
            const m3u8Url = is4K ? replaceAll(m3u8main,'main','4000') : m3u8main;
            return {
                title: (data.title || guid).replace(/[\\/:*?"<>|]/g, '').trim(),
                m3u8Url: m3u8Url,
                is4K: is4K,
                guid: guid
            };
        }
        
        // 工具函数:执行FFmpeg命令
        async function runFFmpeg(args) {
            return runCommand('ffmpeg', [
                '-hide_banner', '-y',
                '-loglevel', 'panic',
                ...args
            ]);
        }
        
        // 工具函数:执行通用命令
        async function runCommand(cmd, args) {
            console.log(`→ ${cmd} ${args.join(' ')}`);
            let startTime = Date.now();
            return new Promise((resolve, reject) => {
                const proc = spawn(cmd, args, { 
                    stdio: ['inherit', 'inherit', 'inherit'],
                    windowsHide: true 
                });
        
                const progressTimer = setInterval(() => {
                    const elapsed = Math.floor((Date.now() - startTime) / 1000);
                    process.stdout.write(`\r⏱️ 已运行: ${elapsed}s `);
                }, 1000);
        
                const timer = setTimeout(() => {
                    clearInterval(progressTimer);
                    proc.kill();
                    reject(`${cmd} 执行超时`);
                }, CONFIG.TIMEOUT);
        
                proc.on('close', code => {
                    clearInterval(progressTimer);
                    clearTimeout(timer);
                    process.stdout.write('\n'); 
                    code === 0 ? resolve() : reject(`退出码 ${code}`);
                });
                proc.on('error', (err) => {
                    clearInterval(progressTimer);
                    clearTimeout(timer);
                    reject(`程序运行错误: ${err.message}`);
                });
            });
        }
        
        // 新增:获取最大码率流的索引
        async function getMaxBitrateStreamIndex(m3u8Url) {
            try {
                const probeResult = spawnSync('ffprobe', [
                    '-v' , 'panic' , '-hide_banner' ,
                    '-show_streams' , '-select_streams' , 'v' ,
                    '-of' , 'json' , '-i' ,
                    m3u8Url.replace("&","^&")
                ]);
        
                if (probeResult.status !== 0) {
                    console.warn('无法获取流信息,使用默认流');
                    return 0;
                }
        
                const probeData = JSON.parse(probeResult.stdout.toString());
                const streams = probeData.streams;
        
                if (!streams || streams.length === 0) {
                    return 0;
                }
        
                // 选择码率最大的流
                // maxSindex为从流信息获取的完整索引值
                let maxSindex = 0;
                // maxVindex为纯视频的索引值
                let maxVindex = 0;
                let maxBr = 0;
                streams.forEach((stream, n) => {
                    const sindex = stream.index;
                    if (sindex > maxSindex) {
                        maxSindex = sindex;
                        maxVindex = n;
                        maxBr = stream.tags.variant_bitrate;
                    }
                });
        
                console.log(`📊 选择最高码率流: 索引=${maxVindex}, 码率=${Math.round(maxBr / 1024000)} Mbps`);
                return maxVindex;
            } catch (error) {
                console.warn('获取流信息失败,使用默认流:', error.message);
                return 0;
            }
        }
        
        // 主处理函数
        async function processVideo(guid) {
            let tmpDir = '';
            try {
                const { title, m3u8Url, is4K, guid: fileGuid } = await fetchVideoMeta(guid);
                const safetitle = replaceAll(title,' ','_');
                const outputPath = join(CONFIG.PUBLIC_DOWNLOADS, `${safetitle}.mp4`);
                console.log(`\n${is4K ? '🟢 4K' : '🟠 标准'}视频: ${safetitle}`);
                console.log(`🔗 M3U8: ${m3u8Url}`);
        
                if (is4K) {
                    // 4K直通模式 - 选择最大码率流
                    await runFFmpeg([
                        '-protocol_whitelist', 'file,http,https,tcp,tls',
                        '-i', m3u8Url,
                        '-c', 'copy',
                        '-movflags', '+faststart',
                        outputPath
                    ]);
                } else {
                    const brbps =[450,850,1200,2000];
                    const maxVindex = await getMaxBitrateStreamIndex(m3u8Url);
                    const m3u8Max=brbps[maxVindex];
                    const m3u8MaxUri=replaceAll(m3u8Url,'main',m3u8Max);
                    // 标准处理流程 - 选择最大码率流
                    tmpDir = join(CONFIG.PUBLIC_DOWNLOADS, `tmp_${fileGuid}`);
                    await mkdir(tmpDir, { recursive: true });
        
                    const tsFile = join(tmpDir, `${fileGuid}.ts`);
                    const m2tFile = join(tmpDir, `${fileGuid}.m2t`);
        
                    // 下载时选择最大码率流
                    await runFFmpeg([
                        '-protocol_whitelist', 'file,http,https,tcp,tls',
                        '-i', m3u8MaxUri,
                        '-c', 'copy',
                        tsFile
                    ]);
        
                    await runCommand('cbox.exe', [tsFile, m2tFile]);
        
                    await runFFmpeg([
                        '-i', m2tFile,
                        '-c', 'copy',
                        '-movflags', '+faststart',
                        outputPath
                    ]);
                }
        
                console.log(`✅ 输出: ${outputPath}`);
                return true;
            } catch (e) {
                console.error(`❌ 失败: ${e.message}`);
                return false;
            } finally {
                if (tmpDir != '') {
                    try {
                        await rm(tmpDir, { recursive: true, force: true });
                        console.log(`🧹 已清理临时目录: ${tmpDir}`);
                    } catch (cleanupErr) {
                        console.warn(`⚠️ 清理临时目录失败: ${cleanupErr.message}`);
                    }
                }
            }
        }
        
        // 主交互流程
        async function main() {
            console.log(`
        ▓▓ CNTV视频下载器 ▓▓
        📊 功能: 自动选择最高码率流下载
        临时目录: tmp_[GUID]
        v1.1.0_20250826 (支持码率选择)
        ───────────────────`);
        
            while (true) {
                const input = await new Promise(resolve => 
                    rl.question('输入GUID(多GUID用逗号分隔/q退出): ', resolve));
                if (input.length < 32) break;
                if (input.toLowerCase() === 'q') break;
        
                const guids = input.split(',')
                    .map(g => g.trim())
                    .filter(g => /^[a-f0-9]{32}$/i.test(g));
        
                for (const guid of guids) {
                    await processVideo(guid);
                }
            }
        
            rl.close();
            console.log('程序结束');
        }
        
        if (require.main === module) {
            process.on('SIGINT', () => {
                console.log('\n操作已取消');
                process.exit();
            });
        
            main().catch(e => console.error('致命错误:', e));
        }
  4. weaponjang
    Windows Chrome 137.0.0.0
    2 月前
    2025-8-27 10:37:33

    GUID超简单获取办法:

     javascript:prompt("复制输入框中的GUID",guid);
  5. 0225
    Windows Edge 139.0.0.0
    2 月前
    2025-9-02 14:59:11

    大佬,我想问问https://app.cctv.com/special/m/livevod/index.html?guid=2c529b37a6e8425cbe450f8db39ebb6f&vtype=2&vsetId=C11346这种网址的也能解析吗?我们需要解析央视推介我们的视频到自己账号

    • 博主
      0225
      Windows Chrome 138.0.0.0
      2 月前
      2025-9-02 22:25:51

      是走央视的CDN直接引用视频到自己网站,还是下载下来上传到自己的阿里云OSS?

    • weaponjang
      0225
      Windows Chrome 137.0.0.0
      2 月前
      2025-9-04 10:47:13

      这个链接直接提供了guid,更方便了,我下载了,最高720P,大概16MB容量.

      • 博主
        weaponjang
        Windows Chrome 139.0.0.0
        2 月前
        2025-9-04 13:22:35

        这个链接是使用手机版本的央视影音客户端分享的

    • weaponjang
      0225
      Windows Chrome 137.0.0.0
      2 月前
      2025-9-04 10:56:18

      对应的网页版链接在这里https://tv.cctv.com/2025/09/02/VIDENE556yA1aGO7ojr0QSEH250902.shtml

  6. weaponjang
    Windows Chrome 137.0.0.0
    2 月前
    2025-9-05 15:44:08

    为了不想下载python的人搞了个才2M大的exe文件,放到run.py同级文件夹下,运行的命令改成 run 视频GUID值
    网盘地址 https://cowtransfer.com/s/28d1a269d82d42
    口令 3elxpk

  7. weaponjang
    Windows Chrome 137.0.0.0
    2 月前
    2025-9-05 16:20:19

    开发了一个支持批量输入guid的,分隔符是半角逗号,和博主的程序要求差不多,都需要ffmpeg.exe这个可执行程序文件,
    这个exe文件可以去这个网址下载https://registry.npmmirror.com/binary.html?path=ffmpeg-static/b6.0/ 根据自己的系统架构选择,如果下载的是.gz结尾的则需要解压缩
    32位系统只能选择下载ffmpeg-win32-ia32 ,64位则可以下载ffmpeg-win32-x64 ,也可以下载32位的,然后重命名成ffmpeg.exe ,并放到和解压出来的run.exe同一个文件夹下
    只要双击打开run.exe,输入视频的guid值(多个guid值用英文逗号隔开,中间不要有空格),然后按回车键,就会立即下载了,成功下载会提示成功,并让用户输入下一组guid值,
    下载完成后的文件则保存在C:UsersPublicDownloads目录下
    网盘地址 https://cowtransfer.com/s/3423c8be67f641 传输口令 dbbols
    文件名是cctv-guids_250905.zipx ,下载下来之后要把扩展名改回.zip再解压,如果压缩软件能识别,那不改也行

  8. weaponjang
    Windows Chrome 137.0.0.0
    2 月前
    2025-9-09 15:25:05

    让Ai写程序,其实不如用go语言或者nodejs,bunjs等容易获取运行时的语言,此类语言对看教程的读者会更友好,比如go语言,作者可直接将代码编译成可执行的单文件,不需要读者配置环境,或者是bunjs,既可用运行时调用脚本运行,也可以直接打包进运行时成为可执行文件,nodejs虽然没有原生打包脚本成可执行文件的功能,不过也有工具支持打包,哪怕不打包成单个可执行文件,用”node.exe 脚本路径” 调用也比较简单,不需要配置复杂的环境,当然bunjs和nodejs不需要配置复杂的环境前提是只使用了原生方法,不包含第三方库的情况,不过js系和python相比其实没啥体积优势,所以最推荐的还是go语言,AI已经能很高效准确的生成代码了

  9. ww
    Windows Edge 138.0.0.0
    2 月前
    2025-9-15 15:57:17

    大佬,脚本运行到【开始调用】cbox.exe处理的适合报错【命令执行失败(退出码 4294967295)】,请问是方法失效了吗?

    • weaponjang
      ww
      Windows Chrome 137.0.0.0
      2 月前
      2025-9-17 12:30:55

      会不会是因为路径里有中文,包括但不限于这个软件的路径有中文,缓存文件的路径里有中文

    • weaponjang
      ww
      Windows Chrome 137.0.0.0
      2 月前
      2025-9-17 12:51:07

      博主的程序貌似要求用户名和脚本所在的绝对路径都不能包含中文或其他全角字符,原版的cbox.exe对4K等频道的视频兼容性不佳也会导致报错,
      或者你可以试试我开发的二进制版本(需要解压到和run.py同级的文件夹里再运行),
      在评论区找到cctv-guids_250905.zipx所在的楼层,我开发的版本不会要求用户名不是中文,也不需要python环境,

  10. tq
    Windows Edge 140.0.0.0
    1 月前
    2025-9-24 22:03:39

    运行 python 脚本,有如下报错是因为压缩包里 cbox 不对吗?这是个什么程序?
    命令执行失败(退出码 3221225477):.cbox.exe C:UserstqDownloads9a5c91a664af49dbba8f5e193fbf3c7bPart_000.ts C:UserstqDownloads9a5c91a664af49dbba8f5e193fbf3c7bPart_000_output.ts

    • weaponjang
      tq
      Windows Chrome 137.0.0.0
      1 月前
      2025-9-29 11:39:20

      要不您试试这个,双击打开后输入guid,支持多个GUID用半角逗号作为分隔符
      需要把ffmpeg.exe放到cbox.exe同级文件夹
      网盘地址 https://cowtransfer.com/s/3423c8be67f641 传输口令 dbbols

      • qiugui
        weaponjang
        Windows Chrome 141.0.0.0
        3 天前
        2025-11-02 0:35:38

        大佬这个好像用不了了,还有新的方法吗
        [h264 @ 000001d8c3dd1100] top block unavailable for requested intra mode
        [h264 @ 000001d8c3dd1100] error while decoding MB 3 0, bytestream 34510
        [h264 @ 000001d8c3dd1100] concealing 3600 DC, 3600 AC, 3600 MV errors in I frame
        [h264 @ 000001d8c3dd1100] top block unavailable for requested intra mode
        [h264 @ 000001d8c3dd1100] error while decoding MB 10 0, bytestream 18219
        [h264 @ 000001d8c3dd1100] concealing 3600 DC, 3600 AC, 3600 MV errors in P frame
        [h264 @ 000001d8c3dd1100] concealing 3515 DC, 3515 AC, 3515 MV errors in B frame
        [h264 @ 000001d8c3dd1100] top block unavailable for requested intra mode
        [h264 @ 000001d8c3dd1100] error while decoding MB 24 0, bytestream 16863
        [h264 @ 000001d8c3dd1100] concealing 3600 DC, 3600 AC, 3600 MV errors in P frame
        [h264 @ 000001d8c3dd1100] concealing 3509 DC, 3509 AC, 3509 MV errors in B frame
        [h264 @ 000001d8c3dd1100] top block unavailable for requested intra mode -1
        [h264 @ 000001d8c3dd1100] error while decoding MB 19 0, bytestream 14833
        [h264 @ 000001d8c3dd1100] concealing 3600 DC, 3600 AC, 3600 MV errors in P frame
        [h264 @ 000001d8c3dd1100] concealing 3040 DC, 3040 AC, 3040 MV errors in B frame
        [h264 @ 000001d8c3dd1100] top block unavailable for requested intra mode -1
        [h264 @ 000001d8c3dd1100] error while decoding MB 25 0, bytestream 13241
        [h264 @ 000001d8c3dd1100] concealing 3600 DC, 3600 AC, 3600 MV errors in P frame
        Input #0, mpegts, from ‘C:UsersPublicDownloadstmp_1a59cebf63fe4ab4bd4b898ec0318db91a59cebf63fe4ab4bd4b898ec0318db9.ts’:
        Duration: 00:59:42.28, start: 1.440000, bitrate: 2120 kb/s
        Program 1
        Metadata:
        service_name : Service01
        service_provider: FFmpeg
        Stream #0:0[0x100]: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p(progressive), 1280×720 [SAR 1:1 DAR 16:9], 25 fps, 25 tbr, 90k tbn
        Stream #0:10x101: Audio: aac (LC) ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp, 131 kb/s
        Output #0, mpegts, to ‘C:UsersPublicDownloadstmp_1a59cebf63fe4ab4bd4b898ec0318db91a59cebf63fe4ab4bd4b898ec0318db9.m2t’:
        Stream #0:0: Video: h264 (High), yuv420p(progressive), 1280×720 [SAR 1:1 DAR 16:9], q=2-31
        Stream #0:1: Audio: aac (LC), 48000 Hz, stereo, fltp, 131 kb/s
        🧹🧹 已清理临时目录: C:UsersPublicDownloadstmp_1a59cebf63fe4ab4bd4b898ec0318db9
        ❌❌ 失败: cbox处理失败: exit status 0xc0000005

        • 博主
          qiugui
          Windows Chrome 141.0.0.0
          2 天前
          2025-11-02 11:16:46

          我测试没问题

  11. Windows Chrome 141.0.0.0
    2 周前
    2025-10-18 19:45:04

    19:41:42.607 开始下载文件
    19:41:42.612 完成数量 8 / 7
    19:41:42.613 重试次数 16 / 15
    19:41:45.621 开始下载文件
    19:41:45.625 完成数量 8 / 7
    19:41:45.626 下载失败, 程序退出
    2025/10/18 19:41:48 命令执行失败(退出码 -1):D:cctv_decN_m3u8DL-CLI.exe https://dhls2.cntv.qcloudcdn.com/asp/enc2/hls/main/0303000a/3/default/d10f87407b394738a8afebf26c46f184/main.m3u8 –workDir C:UserslenovoDownloads –saveName d10f87407b394738a8afebf26c46f184 –noMerge

  12. weaponjang
    Windows Chrome 137.0.0.0
    1 天前
    2025-11-03 12:29:14

    我发现标题和主席有关的视频片段出现720P高码率的可能性大一点

发送评论 编辑评论


				
上一篇