腾讯视频客户端(MacOS)缓存文件转mp4

2018-04-14 作品 #Shell #MacOS

年会时抽奖中了一个极米投影仪,现在看片大多都使用投影仪来播放。我是开通了腾讯视频的会员,但是因为腾讯视频有TV版的缘故,其他版本没有给开放投屏功能。那么这就很尴尬了,TV版会员太贵并且也没必要买,普通客户端不支持投屏并且缓存的资源也不是一个正常可以直接用其他播放器观看的格式。

思路

通过查看客户端缓存的目录发现,视频是被切割为单个小的ts文件,也就是并没有做任何处理,只是一个切割操作而已。最重要的是切割的ts文件是有序的,文件名是以0,1,2,3,4这样的顺序命名的,所以只要想办法把文件按顺序合成就可以正常用其他播放器投屏观看了。

那么写个简单的shell脚本就可以实现这个操作(将ts文件按顺序合成到mp4)

步骤

最初尝试使用递归获取.ts文件并合并,这也是最简单的方式,但是由于直接使用 find . -name ‘*.ts’ 的结果是无序的,导致最终合成的视频顺序不正确

所以最终决定按以下最稳的方式实现

  1. 将指定视频子目录下的所有ts文件放到一个临时目录下,方便处理(因为文件名是有序的)
  2. 进入临时目录,获取文件的数量
  3. 根据文件数量遍历将文件合成到指定文件
  4. 删除临时目录

脚本

视频路径

腾讯视频的缓存目录在:

~/Library/Containers/com.tencent.tenvideo/Data/Library/Application\ Support/Download/video/

video目录下除了ad文件夹之外的所有文件夹都是已经缓存的视频,可以查看子文件夹中.ts文件的内容(可以空格键直接预览)然后确定具体是哪个视频的缓存资源

使用示例

asciicast

merge.sh b0025s0ph00.321004.hls ~/Downloads/合成视频1.mp4

脚本内容

#!/bin/bash

clear

cat << EOF
################### 腾讯视频(MacOS)缓存文件合成脚本 ###################

Author: eightpigs <[email protected]>
Date: 2018-04-14

EOF

echo -n "=> 准备数据... "

# 生成的目标文件
target=$2
# 源文件(.ts文件的目录)
source='/Users/'$USER'/Library/Containers/com.tencent.tenvideo/Data/Library/Application Support/Download/video/'$1'/'

# 使用时间戳来做临时目录
tmpDir='/tmp/merge_tencent/'`date +%s`'/'
mkdir -p $tmpDir

# 进入到视频的ts目录
cd "$source"

echo "完成"

echo -n "=> 合并文件夹... "
# 将文件递归移动到临时目录
for i in $(find ./ -name '*.ts');
do
    cp -vf $i $tmpDir > /dev/null 2>&1;
done

echo "完成"

cd $tmpDir


echo -n "=> 获取需要合成文件数... "

# 总共有多少文件
# 因为ts 文件是有顺序的(文件名)
count=`ls -l $tmpDir |grep "^-"|wc -l | sed 's/[[:space:]]//g'`

echo "完成"

echo -n "=> 合成文件... "

# 按顺序合并
for ((i=0; i<$count; i ++))  
do  
    cat "$tmpDir"$i'.ts'>>"$target"
done

echo "完成"

cat << EOF

结果:
    文件数: $count
    大小:  `ls -lh $target | awk '{print $5}'`
    路径:$target

######################################################################

EOF

rm -rf $tmpDir



文章作者:eightpigs
创作时间:2018-04-14
更新时间: 2019-03-04
许可协议:CC by-nc-nd 4.0